From 55c33c77ddd317dd5a0b3764a5849d01dfe73fd9 Mon Sep 17 00:00:00 2001
From: tracedeng <56997132@qq.com>
Date: Mon, 16 Aug 2021 10:05:31 +0800
Subject: [PATCH] obs build statistics to grafana
---
changelogs/changelog_03/fluent.conf | 222 ++++++++++++++++++
.../obs_build_statistics_to_grafana.md | 75 ++++++
changelogs/openEuler_OBS_changelogs.md | 2 +-
3 files changed, 298 insertions(+), 1 deletion(-)
create mode 100644 changelogs/changelog_03/fluent.conf
create mode 100644 changelogs/changelog_03/obs_build_statistics_to_grafana.md
diff --git a/changelogs/changelog_03/fluent.conf b/changelogs/changelog_03/fluent.conf
new file mode 100644
index 0000000..2c9994d
--- /dev/null
+++ b/changelogs/changelog_03/fluent.conf
@@ -0,0 +1,222 @@
+# openEuler:Mainline
+
+ @type tail
+ path /srv/obs/build/openEuler:Mainline/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:Mainline/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:Mainline
+ tag obs_job_history.openEuler:Mainline
+ refresh_interval 60s
+ #read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:Factory
+
+ @type tail
+ path /srv/obs/build/openEuler:Factory/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:Factory/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:Factory
+ tag obs_job_history.openEuler:Factory
+ refresh_interval 60s
+ #read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:20.03:LTS
+
+ @type tail
+ path /srv/obs/build/openEuler:20.03:LTS/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:20.03:LTS/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:20.03:LTS
+ tag obs_job_history.openEuler:20.03:LTS
+ refresh_interval 60s
+ #read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:20.03:NEXT
+
+ @type tail
+ path /srv/obs/build/openEuler:20.03:LTS:Next/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:20.03:LTS:Next/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:20.03:LTS:Next
+ tag obs_job_history.openEuler:20.03:LTS:Next
+ refresh_interval 60s
+ #read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:20.03:LTS:SP1
+
+ @type tail
+ path /srv/obs/build/openEuler:20.03:LTS:SP1/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:20.03:LTS:SP1/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:20.03:LTS:SP1
+ tag obs_job_history.openEuler:20.03:LTS:SP1
+ refresh_interval 60s
+ #read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:20.03:LTS:SP2
+
+ @type tail
+ path /srv/obs/build/openEuler:20.03:LTS:SP2/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:20.03:LTS:SP2/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:20.03:LTS:SP2
+ tag obs_job_history.openEuler:20.03:LTS:SP2
+ refresh_interval 60s
+ read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:20.09
+
+ @type tail
+ path /srv/obs/build/openEuler:20.09/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:20.09/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:20.09
+ tag obs_job_history.openEuler:20.09
+ refresh_interval 60s
+ #read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:21.03
+
+ @type tail
+ path /srv/obs/build/openEuler:21.03/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:21.03/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:21.03
+ tag obs_job_history.openEuler:21.03
+ refresh_interval 60s
+ read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+# openEuler:21.09
+
+ @type tail
+ path /srv/obs/build/openEuler:21.09/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:21.09/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd/pos_file/openEuler:21.09
+ tag obs_job_history.openEuler:21.09
+ refresh_interval 60s
+ read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types readytime:integer, starttime:integer, endtime:integer
+
+
+
+
+ enable_msgpack_time_support true
+
+
+# filter
+
+ @type record_transformer
+ enable_ruby
+
+ project ${tag_suffix[1]}
+ duration ${record["endtime"] - record["starttime"]}
+ pending ${record["starttime"] - record["readytime"]}
+ success ${if record["code"] == "succeeded"; 1; else; 0; end;}
+ failed ${if record["code"] == "succeeded"; 0; else; 1; end;}
+ readytime_date ${ require 'date'; DateTime.strptime(record["readytime"].to_s, "%s").new_offset(8.0/24).strftime("%Y-%m-%dT%H:%M:%S%z") }
+ starttime_date ${ require 'date'; DateTime.strptime(record["starttime"].to_s, "%s").new_offset(8.0/24).strftime("%Y-%m-%dT%H:%M:%S%z") }
+ endtime_date ${ require 'date'; DateTime.strptime(record["endtime"].to_s, "%s").new_offset(8.0/24).strftime("%Y-%m-%dT%H:%M:%S%z") }
+ created_at ${ require 'date'; DateTime.strptime(record["starttime"].to_s, "%s").new_offset(8.0/24).strftime("%Y-%m-%dT%H:%M:%S%z") }
+
+
+
+# route
+
+ @type kafka2
+ brokers 159.138.58.212:9092,159.138.58.212:9093,159.138.58.212:9094
+
+
+ @type json
+
+
+
+ @type file
+ path /srv/obs/build/fluentd/buff_file/buffer
+ flush_interval 3s
+ chunk_limit_size 5m
+
+
+ topic_key topic
+ default_topic openeuler_statewall_ci_obs_job_history
+
+ require_ack 1
+
+
+# obs build status summary
+
+ @type tail
+ path /srv/obs/build/fluentd/build_status_summary
+ pos_file /srv/obs/build/fluentd/pos_file/build_status_summary
+ tag obs_build_status.summary
+ refresh_interval 60s
+ read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+ types ctime:integer, building:integer, blocked:integer, signing:integer, finished:integer, scheduled:integer, dispatching:integer, succeeded:integer, failed:integer, unresolvable:integer, disabled:integer, excluded:integer, broken:integer, locked:integer, unknown:integer, ctime:integer, stable:integer
+
+
+
+
+ @type record_transformer
+ enable_ruby
+
+ runing ${record["building"] + record["blocked"] + record["signing"] + record["finished"] + record["scheduled"] + record["dispatching"]}
+ foldup ${record["succeeded"] + record["failed"] + record["unresolvable"] + record["disabled"] + record["excluded"] + record["broken"] + record["locked"] + record["unknown"]}
+ ctime_date ${ require 'date'; DateTime.strptime(record["ctime"].to_s, "%s").new_offset(8.0/24).strftime("%Y-%m-%dT%H:%M:%S%z") }
+
+
+
+
+ @type kafka2
+ brokers 159.138.58.212:9092,159.138.58.212:9093,159.138.58.212:9094
+
+
+ @type json
+
+
+
+ @type file
+ path /srv/obs/build/fluentd/buff_file/buffer2
+ flush_interval 3s
+ chunk_limit_size 5m
+
+ topic_key topic2
+ default_topic openeuler_statewall_ci_obs_build_status_summary
+
+ required_acks 1
+
diff --git a/changelogs/changelog_03/obs_build_statistics_to_grafana.md b/changelogs/changelog_03/obs_build_statistics_to_grafana.md
new file mode 100644
index 0000000..79f3030
--- /dev/null
+++ b/changelogs/changelog_03/obs_build_statistics_to_grafana.md
@@ -0,0 +1,75 @@
+# obs构建历史数据同步
+## 安装fluentd
+```shell script
+yum install ruby
+yum install ruby-dev
+yum install gem
+
+# 安装不上可尝试修改ruby源
+# gem source -a https://gems.ruby-china.com
+
+gem install fluentd
+gem install json
+
+fluent-gem install fluent-plugin-kafka
+```
+
+````shell script
+# 目录下生产配置文件/etc/fluentd/fluent.conf
+fluentd --setup /etc/fluentd
+````
+
+## fluent配置
+
+> fluent.conf
+
+```
+# openEuler:Mainline
+
+ @type tail
+ path /srv/obs/build/openEuler:Mainline/standard_x86_64/x86_64/:jobhistory,/srv/obs/build/openEuler:Mainline/standard_aarch64/aarch64/:jobhistory
+ pos_file /srv/obs/build/fluentd_pos_file/openEuler:Mainline
+ tag obs_job_history.openEuler:Mainline
+ refresh_interval 60s
+ read_from_head true
+
+ @type regexp
+ expression /^(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)$/
+
+
+
+# filter
+
+ @type record_transformer
+
+ project ${tag_parts[1]}
+ duration ${record["endtime"] - record["starttime"]}
+ fluentd_time ${time}
+
+
+
+# route
+
+ @type kafka2
+ brokers 127.0.0.1:9092
+
+
+ @type json
+
+
+
+ @type file
+ path /srv/obs/build/fulentd/fluentd_buffer
+ flush_interval 3s
+
+ topic_key topic
+ default_topic openeuler_statewall_obs_job_history
+
+ required_acks 1
+
+```
+
+## 运行fluentd
+```shell script
+fluentd -c /etc/fluentd/fluentd.conf -d /var/log/fluentd/fluentd.pid -o /var/log/fluentd/fluentd.log
+```
diff --git a/changelogs/openEuler_OBS_changelogs.md b/changelogs/openEuler_OBS_changelogs.md
index 47ac756..98e52ce 100644
--- a/changelogs/openEuler_OBS_changelogs.md
+++ b/changelogs/openEuler_OBS_changelogs.md
@@ -20,7 +20,7 @@
|--|--|--|--|--|--|--|--|
| 1 | 2021-08-06 | 硬件扩展|OBS构建时长优化(测试)|新增other_backend节点。该节点新增完成后用于配置openEuler-Mainline-copy工程。加入ARM 002、003、004等三个worker节点到新server(other_backend)|曹志 |否|NULL|
| 2 | 2021-08-12 | 配置变更|OBS构建时长优化(测试)|原来注册到backend节点的说有worker节点都注册到给other_back的server节点上。节点信息:X86:obs-worker-001,obs-worker-002,obs-worker-003,obs-worker-004,obs-worker-005,obs-worker-006,obs-worker-007,obs-worker-008,obs-worker-009,obs-worker-010,obs-worker-0010,obs-worker-0011,obs-worker-0012,obs-worker-0013,obs-worker-0018,obs-worker-0019,obs-worker-0020,obs-worker-0021,obs-worker-0022,obs-worker-0023,obs-worker-0024,obs-worker-0025,obs-worker-0026,obs-worker-0027,obs-worker-0028,obs-worker-0029,obs-worker-0030,ARM:ecs-obsworker-201,ecs-obsworker-202,ecs-obsworker-203,ecs-obsworker-204,ecs-obsworker-205,ecs-obsworker-206,ecs-obsworker-207,ecs-obsworker-208,ecs-obsworker-209,ecs-obsworker-0001,ecs-obsworker-0002,ecs-obsworker-0003,ecs-obsworker-0004,ecs-obsworker-0005,ecs-obsworker-0006,ecs-obsworker-0007,ecs-obsworker-0008,ecs-obsworker-0013,ecs-obsworker-0014,ecs-obsworker-0015,ecs-obsworker-0016,ecs-obsworker-0017,ecs-obsworker-0018,ecs-obsworker-0019,ecs-obsworker-0020|陈燕潘 |否|NULL|
-| 3 | | | | | | | |
+| 3 | 20210816 | 常驻服务 | 看板数据(单包构建时长) | 参考 "obs_build_statistics_to_grafana.md" | 邓鹏 | 是 | changelog_03/fluent.conf, changelog_03/obs_build_statistics_to_grafana.md|
| 4 | | | | | | | |
--
Gitee