工作记录:Skywalking 对Java服务进行日志分析指标收集

发布时间 2023-06-02 11:10:27作者: SanXing

版本号:8.9.0
目标:通过日志分析生成日志对应级别指标,skywalking页面展示指标采集情况,并配置指标规则告警到钉钉
分析前提:skywalking已收集到对应服务的日志 ,日志列表可查询到服务日志

1.日志分析指标配置

Application配置

修改config/application.yaml

log-analyzer:
  selector: ${SW_LOG_ANALYZER:default}
  default:
    lalFiles: ${SW_LOG_LAL_FILES:lal}
    malFiles: ${SW_LOG_MAL_FILES:log-mal}
  • log-analyzer/defalut/lalFiles配置lal : 使用config/lal/lal.yaml配置文件
  • log-analyzer/defalut/malFiles配置log-mal: 使用config/log-mal-rules/log-mal.yaml配置文件

LAL配置

修改config/lal/lal.yaml配置文件

rules:
  - name: log_count_rule
    dsl: |
      filter {
        text {
          abortOnFailure true
          regexp "(?<timestamp>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{3}) \\[TID:(?<tid>.+?)] \\[(?<thread>.+?)] (?<level>\\w{4,})"
        }
        extractor {
          metrics {
            timestamp log.timestamp as Long
            labels level: parsed.level, service: log.service, instance: log.serviceInstance, timestamp: log.timestamp
            name "log_count"
            value 1
          }
        }
        sink {
          if (parsed.level == "INFO") {
            enforcer { }
          }
          if (parsed.level == "ERROR") {
            enforcer { }
          }
          if (parsed.level == "WARN") {
            enforcer { }
          }
        }
      }

MAL配置

修改config/log-mal-rules/log-mal.yaml配置文件

expSuffix: instance(['service'], ['instance'])
metricPrefix: log
metricsRules:
  - name: count_info
    exp: log_count.tagEqual('level', 'INFO').sum(['service', 'instance']).downsampling(SUM)
  - name: count_warn
    exp: log_count.tagEqual('level', 'WARN').sum(['service', 'instance']).downsampling(SUM)
  - name: count_error
    exp: log_count.tagEqual('level', 'ERROR').sum(['service', 'instance']).downsampling(SUM)

2.重启SKywalking

关闭SKywalking

lsof -i:8088 
lsof -i:11800
kill -9 对应PID

启动Skywalking

skywalking目录下启动
sh bin/startup.sh

查看启动日志
tail -f logs/skywalking-oap-server.log

无异常表示正常启动

有异常有可能是索引创建失败的问题 可以忽略

3.指标配置展示

UI首页

image

新建指标栏目

image

1:解锁
2:新建log栏目
3:新建指标
4:指标配置明细(log_count_info,log_count_warn,log_count_error)
5:点击上锁按钮保存

指标收集情况

image

4.指标告警钉钉配置

非oal指标不支持告警

5.调试历程记录

ES索引异常处理

最初使用官方文档的lal及mal配置启动服务,查看启动日志偶尔会出现索引不存在的情况
不存在的索引比如:
sw_profile_task
sw_alarm_record
sw_top_n_database_statement
sw_browser_error_log
查阅资料发现:定时任务删除索引时未删除对应索引模板会导致这个问题
问题解决:使用es内部的删除模板方法
curl -XDELETE http://127.0.0.1:9200/_template/索引模板名
后续:调整删除索引的脚本及时清理索引模板

8.9.0本地环境部署

下载zip文件本地启动缺少jar包
改用git拉取分支并按照网上教程生成编译文件并调整启动目录 成功启动
本地fuzhiweb启动添加agent代理 启动fuzhiweb

指标收集调试

源码调试dsl脚本 发现正则表达式格式有问题 提取不到parsed字段数据 修改正则匹配
timestamp字段不能使用parsed.timestamp String类型 通过调试发现log有时间戳字段 改用log.timestamp 数据收集成功
使用sink关键字收集对应日志进行持久化 否则日志丢失
mal脚本调试使用如下配置不能收集到value值(日志数量)

expSuffix: instance(['service'], ['instance'])
metricPrefix: log
metricsRules:
  - name: count_info
    exp: log_count.tagEqual('level', 'INFO').sum(['service', 'instance'])

改用downsampling(SUM)函数成功收集到value值(日志数量)

SkywalkingUI指标页面展示

页面接口采用graphql查询语言 响应值返回value属性值
image

1:配置metrics
2:设置区间值
3:指标域

告警规则调试

AlarmCore类 启动告警规则10s定时轮询
image

触发告警的meta来源于core.oal以及jvm.oal 因此无法匹配告警规则中的指标名称
image

6.记录总结

skywalking8.9.0支持日志分析生成日志对应级别指标,并在skywalking页面展示指标采集情况
skywalking8.9.0不支持lal、mal协作收集到的指标进行规则告警

7.参考资料

skywalking源码库
skywalking官网