diff --git a/devcloud/audit/apps/event/consumer/consumer.go b/devcloud/audit/apps/event/consumer/consumer.go index 76ce030..5eb1250 100644 --- a/devcloud/audit/apps/event/consumer/consumer.go +++ b/devcloud/audit/apps/event/consumer/consumer.go @@ -28,8 +28,10 @@ func (c *consumer) Run(ctx context.Context) error { // 发送的数据时Json格式, 接收用的JSON, 发送也需要使用JSON err = e.Load(m.Value) if err == nil { + // 保存日志, 保持失败的次数统计起来,披露给外部, 编写一个采集器,来采统计失败次数 if err := event.GetService().SaveEvent(ctx, types.NewSet[*event.Event]().Add(e)); err != nil { c.log.Error().Msgf("save event error, %s", err) + c.collector.Inc() } } diff --git a/devcloud/audit/apps/event/consumer/impl.go b/devcloud/audit/apps/event/consumer/impl.go index 956ada6..827c401 100644 --- a/devcloud/audit/apps/event/consumer/impl.go +++ b/devcloud/audit/apps/event/consumer/impl.go @@ -6,6 +6,7 @@ import ( "122.51.31.227/go-course/go18/devcloud/audit/apps/event" "github.com/infraboard/mcube/v2/ioc" "github.com/infraboard/mcube/v2/ioc/config/log" + "github.com/prometheus/client_golang/prometheus" "github.com/rs/zerolog" ioc_kafka "github.com/infraboard/mcube/v2/ioc/config/kafka" @@ -37,6 +38,9 @@ type consumer struct { GroupId string `toml:"group_id" json:"group_id" yaml:"group_id" env:"GROUP_ID"` // 当前这个消费者 配置的topic Topics []string `toml:"topic" json:"topic" yaml:"topic" env:"TOPIC"` + + // 采集器 + collector *EventCollector } // 对象名称 @@ -48,6 +52,11 @@ func (i *consumer) Name() string { func (i *consumer) Init() error { // 对象 i.log = log.Sub(i.Name()) + + // 准备好采集器, 注册给Prometheus + i.collector = NewEventCollector() + prometheus.MustRegister(i.collector) + i.reader = ioc_kafka.ConsumerGroup(i.GroupId, i.Topics) go i.Run(i.ctx) diff --git a/devcloud/audit/apps/event/consumer/metric.go b/devcloud/audit/apps/event/consumer/metric.go new file mode 100644 index 0000000..e5d6a4b --- /dev/null +++ b/devcloud/audit/apps/event/consumer/metric.go @@ -0,0 +1,38 @@ +package consumer + +import "github.com/prometheus/client_golang/prometheus" + +// # HELP save_event_error_count 事件入库失败个数统计 +// # TYPE save_event_error_count gauge +// save_event_error_count{service="devcloud"} 0 +func NewEventCollector() *EventCollector { + return &EventCollector{ + errCountDesc: prometheus.NewDesc( + "save_event_error_count", + "事件入库失败个数统计", + []string{}, + prometheus.Labels{"service": "devcloud"}, + ), + } +} + +// 收集事件指标的采集器 +type EventCollector struct { + errCountDesc *prometheus.Desc + // 需要自己根据实践情况来维护这个变量 + errCount int +} + +func (c *EventCollector) Inc() { + c.errCount++ +} + +// 指标元数据注册 +func (c *EventCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- c.errCountDesc +} + +// 指标的值的采集 +func (c *EventCollector) Collect(ch chan<- prometheus.Metric) { + ch <- prometheus.MustNewConstMetric(c.errCountDesc, prometheus.GaugeValue, float64(c.errCount)) +} diff --git a/skills/metric/README.md b/skills/metric/README.md new file mode 100644 index 0000000..1382d16 --- /dev/null +++ b/skills/metric/README.md @@ -0,0 +1,3 @@ +# Metric + +https://www.mcube.top/guide/config/metric.html \ No newline at end of file