14、代码监控与问题跟踪全解析

代码监控与问题跟踪全解析

1. 代码监控工具概述

在部署代码后,我们需要对其进行监控,以确保系统的稳定运行。常见的监控工具包括用于监控主机和服务状态的Nagios,用于绘制主机统计数据图表的Munin、Ganglia和Graphite,以及用于记录日志信息的log4j和ELK栈。

2. Ganglia监控

由于我们仅运行两个通信容器,在这种情况下无法从多播配置中受益。我们将使用Docker Compose一起启动容器,使单独的Gmond和Gmetad实例能够通信。可以启动三个运行gmond的容器,Gmetad守护进程在默认配置下会发现它们,并将它们列在“My Cluster”下,配置如下:

gmetad:
  image: wookietreiber/ganglia
  ports:
    - "30010:80"
gmond:    
  image: wookietreiber/ganglia
gmond2:    
  image: wookietreiber/ganglia

访问 http://localhost:30010/ganglia/ ,应该能看到新的gmond实例正在被监控。

3. Graphite监控

Munin虽然强大且易于使用,但它提供的图表更新频率较低,通常每五分钟更新一次。因此,需要一个更接近实时绘图的工具,Graphite就是这样的工具。

Graphite栈由以下三个主要部分组成:
- Graphite Web组件 :一个Web应用程序,用于渲染由图表和仪表板组成的用户界面,这些图表和仪表板在树形浏览器小部件中组织。
- Carbon指标处理守护进程 :用于收集指标。
- Whisper时间序列数据库库 :用于存储指标数据。

可以使用Docker Hub上的 sitespeedio/graphite 镜像来尝试Graphite,命令如下:

docker run -it \ -p 30020:80 \ -p 2003:2003 \ sitespeedio/graphite

这将启动一个运行Graphite的Docker容器,并启用HTTP基本认证。输入用户名和密码“guest”,即可查看Graphite的用户界面。如果不更改上述Docker命令中的端口,访问 http://localhost:30020/ 即可。

Graphite具有可定制的用户界面,可以将感兴趣的图表组织到仪表板中,还有一个自动完成小部件,可通过输入图表名称的前几个字符来查找命名图表。

4. 日志处理

日志处理是一个非常重要的概念,传统的日志记录只是在代码中使用简单的打印语句来跟踪事件,这种方式被称为printf风格的调试。例如,在C语言中:

void fn(char *x){
  printf("DEBUG entering fn, x is %s\n", x);
 ...
}

这种调试方式在开发过程中可以帮助我们了解程序的行为,但在部署代码时并不实用。

如今,有许多日志框架支持不同方式的日志记录,它们在printf风格的日志记录基础上定义了标准,并提供了改进的功能,如:
- 不同的日志优先级 :如Debug、Warning、Trace和Error。
- 过滤不同优先级的日志消息 :可以根据需要过滤掉不感兴趣的调试跟踪信息,只关注错误消息。
- 日志记录到不同的目的地 :如文件、数据库或网络守护进程,包括后面会介绍的ELK栈。
- 日志文件的轮转和归档 :可以对旧的日志文件进行归档。

5. 客户端日志库

Log4j是Java中流行的日志框架,它有多个不同语言的端口,如:
- Log4c :用于C语言。
- Log4js :用于JavaScript语言。
- Apache log4net :移植到Microsoft .NET框架。

此外,还有一些包装日志框架,如Apache Commons Logging或Simple Logging Facade for Java (SLF4J),它们允许使用单一接口,并在需要时更换底层的日志框架实现。

Logback是log4j的继任者,与ELK栈兼容。

Log4j主要通过以下三个构造来工作:
- Loggers :用于访问日志方法的类,每个日志级别都有对应的日志方法,并且日志记录器是分层的。

Logger  logger = Logger.getLogger("se.matangle");
  • Appenders :日志消息最终到达的地方,如控制台、文件、网络目的地和日志守护进程。
  • Layouts :控制日志消息的格式,允许使用类似printf的格式化转义序列。
    例如,使用 PatternLayout 配置转换模式 %r [%t] %-5p %c - %m%n ,会生成如下示例输出:
176 [main] INFO  se.matangle - User found

各字段含义如下:
| 字段 | 含义 |
| ---- | ---- |
| 第一个字段 | 程序启动以来经过的毫秒数 |
| 第二个字段 | 发出日志请求的线程 |
| 第三个字段 | 日志语句的级别 |
| 第四个字段 | 与日志请求关联的日志记录器的名称 |
| - 后面的文本 | 语句的消息 |

Log4j努力将日志配置外部化,这样开发人员可以在本地配置日志记录到文件或控制台,部署到生产服务器时,管理员可以将日志追加器配置为其他目的地,如ELK栈,而无需更改代码。

如果不使用应用服务器,较新的Log4j版本支持多种不同的配置格式,例如以下XML样式的文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level 
%logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>
6. ELK栈

ELK栈由以下组件组成:
- Logstash :一个类似于log4j的开源日志框架,其服务器组件处理传入的日志。
- Elasticsearch :存储所有日志并对其进行索引,以便进行搜索。
- Kibana :用于搜索和可视化日志的Web界面。

下面通过一个示例来展示日志消息从代码内部起源,经过中间网络层,最终到达网络操作员屏幕的整个过程:
1. 代码中记录错误 :在代码深处,发生Java异常,应用程序无法将导入文件中的用户ID映射到数据库中的用户ID,使用log4j记录错误:

logger.error("cant find imported user id in database")
  1. 配置log4j将错误日志记录到Logstash后端
log4j.appender.applog=org.apache.log4j.net.SocketAppender
log4j.appender.applog.port=5000
log4j.appender.applog.remoteHost=master
log4j.appender.applog.DatePattern='.'yyyy-MM-dd
log4j.appender.applog.layout=org.apache.log4j.PatternLayout
log4j.appender.applog.layout.ConversionPattern=%d %-5p [%t] %c %M 
- %m%n
log4j.rootLogger=warn, applog
log4j.logger.nl=debug
  1. 配置Logstash监听log4j指定的端口
input {
   log4j {
    mode => server
    host => "0.0.0.0"
    port => 5000
    type => "log4j"
  }
}
output {
stdout { codec => rubydebug }
stdout { }
  elasticsearch {
    cluster => "elasticsearch"
  }
}
  1. Elasticsearch接收日志输出并使其可搜索
  2. 管理员打开Kibana GUI应用程序,实时查看日志或搜索历史数据

虽然这看起来很复杂,但log4j可以配置为支持复杂场景和简单场景,因此使用log4j或其兼容的竞争对手不会出错。可以先不使用网络日志,仅使用普通的日志文件,在需要时再添加ELK栈的功能。同时,保留日志文件也是有用的,如果高级日志记录功能出现故障,可以使用传统的Unix grep实用程序在日志文件中查找信息。

Kibana具有许多功能,可帮助分析日志数据,例如绘制数据图表和过滤特定模式的日志数据。可以使用Docker Hub上的官方Kibana和Elasticsearch Docker镜像来尝试:

docker run -d elasticsearch &&
docker run --link some-elasticsearch:elasticsearch -d kibana

如果一切顺利,就可以访问Kibana用户界面。

7. 问题跟踪系统概述

在开发组织中,问题跟踪系统对于处理开发工作流程非常重要,尤其在实施敏捷流程时是重要的辅助工具。

8. 问题跟踪器的用途

从敏捷流程的角度来看,问题跟踪器用于处理敏捷流程中的细节,所处理的实体可能代表工作项、错误和问题。在敏捷环境中,常见的做法是使用手写便签的物理看板来管理任务,这也是看板方法的核心概念。物理看板可以清晰地展示工作进度,并且易于管理,只需移动便签即可表示工作流状态的变化。

然而,计算机化的问题跟踪器(大多是基于Web的)提供了更详细的信息,并且可以在远程工作时使用。它们还能帮助记住流程中的步骤等。理想情况下,既希望有物理看板,又希望有问题跟踪器,但保持两者的同步是一项艰巨的工作。有些人使用投影仪将问题跟踪器显示为看板,但这缺乏物理看板的触感,而且围绕投影图像或显示器聚集与围绕物理看板聚集的体验不同。物理看板的优势在于团队成员讨论任务时,它始终可用且便于参考。

9. 问题跟踪器的技术实现

从技术上讲,问题跟踪器通常实现为代表状态机的对象数据库,具有不同程度的复杂性。可以通过Web界面、电子邮件或自动化等方式创建问题,然后问题会由于人为交互而经历各种状态,最终以关闭状态存档以供将来参考。有时,流程会因与其他系统的交互而推进,例如任务因过期而自动关闭。

10. 问题的工作流和示例

虽然在本章中使用“issue”一词,但有些系统使用“ticket”或“bug”,从技术上讲它们是相同的。一个问题可能代表待办事项、增强请求或任何其他类型的工作项。从技术上讲,增强请求本质上与错误相同,如果将增强视为缺失的功能,就容易理解了。

一个问题具有各种相关的元数据,最基本的问题类型具有以下基本属性:
- Description :问题的自由文本描述。
- Reporter :打开问题的人。
- Assigned :应该处理该问题的人。
并且有两个状态:打开和关闭。

除了上述基本信息外,以下附加属性通常也很有用:
- Due date :问题预计解决的日期。
- Milestone :一种将问题分组为有用工作包的方式,通常代表Scrum冲刺的输出,里程碑通常也有截止日期,如果使用里程碑功能,通常不会使用单个问题的截止日期。
- Attachments :可以方便地将截图和文档附加到问题上,这对处理问题的开发人员或验证问题的测试人员可能很有用。
- Work estimates :对解决问题所需的预期工作量进行估算,可用于规划目的。同样,记录实际花费在问题上的时间字段对于各种计算也可能有用。然而,估算总是很棘手的,最终可能得不偿失,许多团队在问题跟踪器中不使用此类信息也能很好地工作。

以下是一些有助于更好地模拟敏捷工作流的状态:

graph LR
    A[Open] --> B[In progress]
    B --> C[Ready for test]
    C --> D[Testing]
    D --> E[Done]
    D --> A
    E --> F[Closed]
状态 说明
Open 问题已报告,但尚未有人处理
In progress 有人被分配到该问题并正在解决
Ready for test 问题已完成,准备进行验证
Testing 有人被分配到对问题的实现进行测试
Done 任务标记为准备好,再次取消分配,用于在冲刺结束前跟踪问题
Closed 问题不再被监控,但仍保留以供参考

在理想情况下,问题会按顺序从一个状态过渡到下一个状态,但在实际情况中,由于测试可能发现问题未得到正确修复,任务有可能从测试状态返回到打开状态。

代码监控与问题跟踪全解析

11. 问题跟踪器的基本属性与状态

问题跟踪器所管理的问题,有着不同的属性和状态。基本属性方面,描述(Description)为问题提供了详细的文本说明,让相关人员能清晰了解问题的情况;报告者(Reporter)明确了提出问题的人;分配者(Assigned)则指出负责处理该问题的人员。状态上,最基础的是打开(Open)和关闭(Closed)两种。打开状态意味着问题刚被报告,还未有人着手处理;关闭状态则表示问题已处理完毕,不再被监控,但会保留记录供后续参考。

除了基本属性和状态,还有一些额外的属性和状态能让问题跟踪更加完善。额外属性里,截止日期(Due date)规定了问题预计解决的时间,有助于合理安排工作进度;里程碑(Milestone)可将多个问题组合成有意义的工作包,比如代表Scrum冲刺的成果,且通常有自己的截止日期,使用里程碑功能时,单个问题的截止日期可能不再使用;附件(Attachments)允许添加截图、文档等,方便开发人员和测试人员更好地处理和验证问题;工作估算(Work estimates)对解决问题所需的工作量进行预估,可用于规划,但估算难度较大,很多团队不使用该信息也能正常运作。

额外状态方面,除了前面提到的打开和关闭,还包括进行中(In progress),表示有人正在处理问题;待测试(Ready for test),说明问题已完成,等待验证;测试中(Testing),即有人在对问题的处理结果进行测试;完成(Done),任务完成且取消分配,用于在冲刺结束前跟踪问题。这些状态构成了一个相对完整的工作流,虽然理想情况下问题会按顺序流转,但实际中可能会出现反复,比如测试不通过时问题会从测试状态回到打开状态。

12. 不同类型问题跟踪器的特点对比

不同的问题跟踪器在功能和使用场景上各有特点。物理看板以手写便签的形式呈现,具有直观、方便操作的优点。团队成员可以直接在看板上移动便签来表示工作状态的变化,能清晰地看到整个工作的进展情况。而且,在团队成员讨论任务时,物理看板随时可用,便于参考。然而,物理看板的局限性在于难以进行远程协作,并且在记录详细信息和统计分析方面能力较弱。

计算机化的问题跟踪器大多基于Web,能提供更丰富的功能。它可以记录详细的问题信息,包括各种属性和状态的变化,方便进行数据分析和统计。同时,支持远程访问,即使团队成员不在同一地点也能随时查看和处理问题。此外,还能通过自动化流程提醒相关人员,避免遗漏重要步骤。但计算机化问题跟踪器也存在一些不足,比如学习成本相对较高,需要一定的时间来熟悉操作;而且保持与物理看板的同步较为困难,如果两者不一致,会给团队协作带来困扰。

13. 如何选择合适的问题跟踪器

在选择问题跟踪器时,需要综合考虑多个因素。首先是团队的工作模式,如果团队成员大多在同一地点办公,且更注重面对面的沟通和直观的工作展示,物理看板可能是一个不错的选择。它简单易用,能快速反映工作状态。但如果团队需要进行远程协作,或者需要对问题进行详细的记录和分析,计算机化的问题跟踪器则更为合适。

其次,要考虑问题的复杂程度。对于简单的项目,问题的属性和状态较少,使用基本的问题跟踪功能就能满足需求。但对于复杂的项目,涉及多个团队和大量的工作项,就需要一个功能强大的问题跟踪器,能够支持自定义属性、状态和工作流,以便更好地管理和跟踪问题。

另外,团队成员的技术水平也是一个重要因素。如果团队成员对技术操作不太熟悉,过于复杂的问题跟踪器可能会让他们感到困惑,影响工作效率。此时,选择一个操作简单、易于上手的工具更为合适。而对于技术能力较强的团队,则可以选择功能丰富、扩展性好的问题跟踪器,以满足不断变化的需求。

14. 问题跟踪器的使用最佳实践

在使用问题跟踪器时,遵循一些最佳实践能提高工作效率和问题处理的质量。首先,要确保问题描述清晰准确。详细的描述能让处理人员快速了解问题的本质,避免因信息不足而产生误解。同时,附上相关的截图、日志等附件,能进一步帮助分析问题。

其次,及时更新问题的状态。当问题的状态发生变化时,要及时在问题跟踪器中进行更新,让团队成员了解问题的进展情况。这样可以避免重复工作,提高协作效率。

再者,合理分配问题。根据团队成员的技能和工作量,将问题分配给合适的人员。同时,明确问题的优先级,让处理人员知道哪些问题需要优先处理。

最后,定期对问题跟踪器中的数据进行分析。通过统计不同类型问题的数量、处理时间等信息,找出工作中的瓶颈和问题,以便采取相应的改进措施。

15. 代码监控与问题跟踪的结合应用

代码监控和问题跟踪是软件开发过程中相辅相成的两个环节。代码监控能实时获取系统的运行状态和性能指标,及时发现潜在的问题。当监控到异常情况时,会生成相应的日志信息。这些日志信息可以作为问题跟踪的重要依据,通过问题跟踪器记录和管理这些问题。

例如,在使用ELK栈进行日志处理时,当代码中出现错误,log4j会将错误信息记录下来,并通过Logstash传输到Elasticsearch进行存储和索引。管理员可以通过Kibana查看这些日志信息,发现问题后在问题跟踪器中创建相应的问题。问题跟踪器会记录问题的详细信息,包括错误描述、报告者、分配者等,同时跟踪问题的处理状态。处理人员根据日志信息进行问题排查和修复,完成后更新问题状态。

通过这种结合应用,能形成一个闭环的管理流程,从问题的发现、记录、处理到验证,都能得到有效的跟踪和管理。不仅提高了问题处理的效率,还能为后续的开发和优化提供有价值的参考。

16. 未来发展趋势

随着软件开发行业的不断发展,代码监控和问题跟踪工具也在不断演进。在代码监控方面,实时性和智能化将成为重要的发展方向。未来的监控工具将能够更快速地捕捉系统的变化,提供更精准的分析和预警。同时,借助人工智能和机器学习技术,能够自动识别问题的类型和原因,甚至提供解决方案的建议。

在问题跟踪方面,与其他开发工具的集成将更加紧密。问题跟踪器将与版本控制系统、持续集成/持续部署工具等深度融合,实现数据的无缝流转和共享。此外,移动端的应用也将越来越普及,团队成员可以通过手机随时随地查看和处理问题。

总的来说,代码监控和问题跟踪工具将不断适应新的开发需求和技术趋势,为软件开发团队提供更高效、便捷的支持。

以下是代码监控与问题跟踪结合应用的流程图:

graph LR
    A[代码监控] --> B[发现异常生成日志]
    B --> C[ELK栈处理日志]
    C --> D[管理员通过Kibana查看日志]
    D --> E[在问题跟踪器创建问题]
    E --> F[处理人员接收问题]
    F --> G[根据日志排查修复问题]
    G --> H[更新问题状态]
    H --> I[验证问题是否解决]
    I -->|是| J[关闭问题]
    I -->|否| F
步骤 说明
代码监控 实时获取系统运行状态和性能指标
发现异常生成日志 当监控到异常时,生成相应的日志信息
ELK栈处理日志 通过Logstash传输日志到Elasticsearch存储和索引
管理员通过Kibana查看日志 管理员使用Kibana查看日志信息
在问题跟踪器创建问题 根据日志信息在问题跟踪器中创建问题
处理人员接收问题 问题分配给处理人员
根据日志排查修复问题 处理人员根据日志信息进行问题排查和修复
更新问题状态 处理完成后更新问题状态
验证问题是否解决 对处理结果进行验证
关闭问题 问题解决后关闭问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值