使用Apache NiFi进行Jira分析自动化

问候先生们。我是Masha,今年23岁,我已经研究和实施Apache NiFi已有六个月了。



我应该注意,在熟悉这项技术的一个月后,我开始使用抗抑郁药。 NiFi是触发因素还是最后一根稻草尚不确定,也不清楚它是否参与了这一事实。但是,由于我承诺概述这条道路上等待潜在初学者的所有内容,因此我必须尽可能坦率。



从技术上讲,当Apache NiFi是各种服务之间的强大链接(它在它们之间交换数据,从而可以沿途丰富和修改它们)时,我从分析师的角度来看。这是因为NiFi是一种非常方便的ETL工具。特别是,作为一个团队,我们专注于构建其SaaS架构。



我想在本文中披露 对我的工作流程之一进行自动化的经验,即关于Jira Software的每周报告形成和分发顺便说一下,我还将描述和发布任务跟踪器分析方法论,该方法论将清楚地回答这个问题-员工在做什么-我还将在不久的将来描述和发布。



尽管本文是针对初学者的,但我认为,如果经验丰富的架构师(可以说是专家)对本章进行复习或在各种活动领域中共享他们的NiFi用例,那是正确和有用的。包括我在内的很多人都会感谢您。



简要介绍Apache NiFi概念。



Apache NiFi是用于系统之间的自动化和数据流控制的开源产品。入门非常重要,必须立即意识到两件事。



第一个是低码区。我的意思是?假设从输入NiFi到提取数据的所有数据处理都可以使用标准工具(处理器)进行。对于特殊情况,有一个处理器可以从bash运行脚本。



这表明在NiFi中做某事是错误的-相当困难(但我做到了!-这是第二点)。困难,因为任何处理器都会立即将您踢出-在哪里发送错误?该怎么办?要等多久?在这里,您给了我一点空间!您是否仔细阅读过文档?等等



图片



第二个(关键)是流编程的概念,仅此而已。我个人在这里并没有立即得到它(请不要判断)。凭借在R中进行函数编程的经验,我不知不觉中在NiFi中形成了函数。最终-重做-我的同事告诉我,当他们看到我徒劳地试图结交这些“职能”朋友时。



我认为理论对于今天已经足够了,让我们从实践中学习更多。让我们为每周的Jira分析制定技术规范的相似性。



  • 从一周中获取大量的工作日志和更改历史记录。
  • 显示此期间的基本统计信息并回答问题:团队在做什么?
  • 将报告发送给老板和同事。


为了给世界带来更多利益,我没有每周都停下来,而是开发了一种能够下载大量数据的流程。



让我们弄清楚。



第一步。从API提取数据



Apache NiFi没有单独的项目。我们只有一个通用的工作区,并且能够在其中形成进程组。这已经足够了。



在工具栏中找到“进程组”,然后创建Jira_report组。 进入小组并开始构建工作流程。可以从其组装的大多数处理器都需要上游连接。简而言之,这是触发处理器的触发器。因此,逻辑上整个流程将以常规触发器开始-在NiFi中,这是GenerateFlowFile处理器。 他做什么的。创建由一组属性和内容组成的流文件。属性是与内容关联的字符串键/值对。















内容是一个普通文件,一组字节。想象一下,内容是FlowFile的附件。



我们添加处理器→GenerateFlowFile。在设置中,首先,我强烈建议设置处理器名称(这是一个很好的音调)-“设置”选项卡。还有一点:默认情况下,GenerateFlowFile连续生成流文件。您不太可能会需要此功能。我们会立即将“运行计划”增加最多,例如,最多60秒-“计划”选项卡。 另外,在“属性”选项卡上,我们将以格式yyyy / mm / dd指示报告期的开始日期-report_from属性。 根据Jira API文档,我们在卸载问题上有一个限制-最多不超过1000个。因此,为了获得所有任务,我们将必须形成一个JQL请求,该请求指定分页参数:startAt和maxResults。















让我们使用UpdateAttribute处理器为它们设置属性。同时,我们将缩短报告的生成日期。我们稍后再需要。 您可能已经注意到了Actual_date属性。使用表达式语言设置其值。抓住一个很酷的备忘单 就是这样,我们可以将JQL转换为胖-我们将指示分页参数和必填字段。随后,它将成为HTTP请求的主体,因此,我们会将其发送到内容。为此,我们使用ReplaceText处理器并指定其替换值,如下所示:



















{"startAt": ${startAt}, "maxResults": ${maxResults}, "jql": "updated >= '2020/11/02'", "fields":["summary", "project", "issuetype", "timespent", "priority", "created", "resolutiondate",  "status", "customfield_10100", "aggregatetimespent", "timeoriginalestimate", "description", "assignee", "parent", "components"]}




注意如何编写属性链接。



恭喜,我们已经准备好发出HTTP请求。 InvokeHTTP处理器将适合此处。顺便说一句,他可以做任何事情...我的意思是方法GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS。让我们如下修改其属性:



HTTP方法我们有POST。



我们发的远程URL包括IP,端口和/ rest / api / 2 / search?jql =。



基本身份验证用户名和基本身份验证密码是胖的凭据。



将内容类型更改为在发送消息正文中放入true的application / json b,这意味着发送将来自请求正文中的前一个处理器的JSON。



应用。







提示的响应将是将包含在内容中的JSON文件。我们对其中的两件事感兴趣:total字段,它包含系统中任务的总数,而issues数组中已经包含了其中的一些任务。让我们解析答案并熟悉EvaluateJsonPath处理器。



如果JsonPath指向一个对象,则解析结果将被写入流文件属性。这是一个示例-总字段和以下屏幕。 在JsonPath指向对象数组的情况下,作为解析结果,流文件将被拆分为一个包含与每个对象相对应的内容的集合。这是一个示例-问题字段。我们放入另一个EvaluateJsonPath并写:Property-issue,Value-$。issue。











现在,我们的流现在将不再包含一个文件,而是包含多个文件。它们每个的内容将包含JSON以及有关一个特定任务的信息。



继续。还记得我们将maxResults设置为100吗?在上一步之后,我们将有一百个第一。让我们得到更多并实现分页。



为此,让我们将启动任务编号增加maxResults。让我们再次使用UpdateAttribute:我们将指示startAt属性并为其分配一个新值$ {startAt:plus($ {maxResults})}。



好吧,我们离不开任务的最大数目-RouteOnAttribute处理器。设置如下: 和循环。总之,只要开始任务号小于任务总数,该循环就会运行。在它的出口-一串Tasoks。现在是这样的过程:















是的,朋友,我知道-您厌倦了阅读我对每个广场的评论。您想了解原理本身。我对此没有反对。



本部分应使绝对的初学者可以更轻松地进入NiFi。然后,掌握了我慷慨呈现的模板后,就不难研究细节了。



在欧洲驰。上载工作日志等



好吧,让我们加快速度。正如他们所说,找到差异: 为了更容易理解,我将卸载工作日志和更改历史的过程移到了一个单独的组中。它是这样的: 要解决从Jira自动卸载工作日志时的限制,建议分别引用每个任务。这就是为什么我们需要他们的钥匙。第一列只是将Tasoks流转换为键流。接下来,我们转向“先知”并保存答案。 对于我们来说,以单独的文档形式安排所有任务的工作日志和变更日志将非常方便。因此,我们将使用MergeContent处理器,并将所有流文件的内容与其粘合在一起。























同样在模板中,您会注意到一组用于按史诗卸载数据的组。吉拉(Jira)的史诗是许多其他人绑定的一项常见任务。在仅挖掘部分任务的情况下,此组将非常有用,以免丢失有关其中一些史诗的信息。



最后阶段。生成报告并通过电子邮件发送



好的。所有点均已卸载并以两种方式进入:用于卸载工作日志的组和用于生成报告的脚本。在后者的情况下,我们只有一个STDIN,因此我们需要将所有任务收集在一堆中。我们将在MergeContent中执行此操作,但是在此之前,我们将稍稍更正内容,以便最终的json是正确的。 在脚本生成方块(ExecuteStreamCommand)的前面有一个有趣的Wait处理器。他等待来自工作日志卸载组中的Notify处理器的信号,表明一切就绪,您可以继续进行。接下来,我们从bash-a-ExecuteStreamCommand运行脚本。然后,我们使用PutEmail将报告发送给整个团队。











我将在另一篇文章中详细介绍有关脚本以及在公司中实施Jira Software Analytics的经验,该文章将在前一天准备好。



简而言之,我们开发的报告为单位或团队的工作提供了战略视图。这对于任何老板来说都是无价之宝,您必须同意。



后记



如果您可以一次使用脚本完成所有这些操作,那为什么还要筋疲力尽呢?是的,我同意,但部分同意。



Apache NiFi并没有简化开发过程,而是简化了操作。我们可以随时停止任何线程,进行编辑并重新开始。



此外,NiFi还为我们提供了公司赖以生存的流程的自上而下的视图。在下一组中,我将有另一个脚本。另一个将是我同事的审判。你明白了吧?建筑在您的掌中。正如上司开玩笑说的那样,我们正在实施Apache NiFi,以便以后可以将您全部解雇,而我是唯一按下按钮的人。但这是一个笑话。



嗯,在此示例中,以计划任务的形式生成,用于生成报告和发送信件的letters头也非常非常令人愉快。



我承认,我正计划倾泻自己的灵魂,并向您介绍我在学习技术的过程中踩到的耙子-其中有多少。但是这里已经是很久了。如果主题很有趣,请告诉我。同时,朋友,谢谢您,并在评论中等待您。






有用的链接



一篇巧妙的文章,用手指和字母涵盖了Apache NiFi。俄语



简短指南



很酷的表达语言备忘单



讲英语的Apache NiFi社区欢迎提问。Telegram



上讲俄语的Apache NiFi社区比所有生物都活着。



All Articles