Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ See the `-help` output for more options.
Include InfluxDBWriter data
-collector.influx2
Include InfluxDB2Writer data
-collector.otlpmetrics
Include OTLPWriter data
-debug
Enable debug logging
-icinga.api string
Expand Down
6 changes: 6 additions & 0 deletions icinga2_exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ func main() {
cliCollectorInflux bool
cliCollectorInflux2 bool
cliCollectorGraphite bool
cliCollectorOTLP bool
)

flag.StringVar(&cliListenAddress, "web.listen-address", ":9665", "Address on which to expose metrics and web interface.")
Expand All @@ -82,6 +83,7 @@ func main() {
flag.BoolVar(&cliCollectorInflux, "collector.influx", false, "Include InfluxDBWriter data")
flag.BoolVar(&cliCollectorInflux2, "collector.influx2", false, "Include InfluxDB2Writer data")
flag.BoolVar(&cliCollectorGraphite, "collector.graphite", false, "Include GraphiteWriter data")
flag.BoolVar(&cliCollectorOTLP, "collector.otlpmetrics", false, "Include OTLPMetricsWriter data")

flag.BoolVar(&cliVersion, "version", false, "Print version")
flag.BoolVar(&cliDebugLog, "debug", false, "Enable debug logging")
Expand Down Expand Up @@ -158,6 +160,10 @@ func main() {
prometheus.MustRegister(collector.NewIcinga2GraphiteCollector(c, logger))
}

if cliCollectorOTLP {
prometheus.MustRegister(collector.NewIcinga2OTLPMetricsCollector(c, logger))
}

// Create a central context to propagate a shutdown
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
Expand Down
63 changes: 63 additions & 0 deletions internal/collector/otlpmetrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package collector

import (
"log/slog"

"github.com/martialblog/icinga2-exporter/internal/icinga"

"github.com/prometheus/client_golang/prometheus"
)

type Icinga2OTLPMetricsCollector struct {
icingaClient *icinga.Client
logger *slog.Logger
otlpmetricswriter_otlp_metrics_work_queue_items *prometheus.Desc
otlpmetricswriter_otlp_metrics_work_queue_item_rate *prometheus.Desc
otlpmetricswriter_otlp_metrics_data_buffer_items *prometheus.Desc
otlpmetricswriter_otlp_metrics_data_buffer_bytes *prometheus.Desc
}

func NewIcinga2OTLPMetricsCollector(client *icinga.Client, logger *slog.Logger) *Icinga2OTLPMetricsCollector {
return &Icinga2OTLPMetricsCollector{
icingaClient: client,
logger: logger,
otlpmetricswriter_otlp_metrics_work_queue_items: prometheus.NewDesc("icinga2_otlpmetricswriter_otlp_metrics_work_queue_items", "OTLPMetricsWriter work queue items", nil, nil),
otlpmetricswriter_otlp_metrics_work_queue_item_rate: prometheus.NewDesc("icinga2_otlpmetricswriter_otlp_metrics_work_queue_item_rate", "OTLPMetricsWriter work queue item rate", nil, nil),
otlpmetricswriter_otlp_metrics_data_buffer_items: prometheus.NewDesc("otlpmetricswriter_otlp_metrics_data_buffer_items", "OTLPMetricsWriter data buffer items", nil, nil),
otlpmetricswriter_otlp_metrics_data_buffer_bytes: prometheus.NewDesc("otlpmetricswriter_otlp_metrics_data_buffer_bytes", "OTLPMetricsWriter data buffer bytes", nil, nil),
}
}

func (collector *Icinga2OTLPMetricsCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- collector.otlpmetricswriter_otlp_metrics_work_queue_items
ch <- collector.otlpmetricswriter_otlp_metrics_work_queue_item_rate
ch <- collector.otlpmetricswriter_otlp_metrics_data_buffer_items
ch <- collector.otlpmetricswriter_otlp_metrics_data_buffer_bytes
}

func (collector *Icinga2OTLPMetricsCollector) Collect(ch chan<- prometheus.Metric) {
perfdata, err := collector.icingaClient.GetPerfdataMetrics(icinga.EndpointGraphiteWriter)

if err != nil {
collector.logger.Error("Could not retrieve OTLPMetrics metrics", "error", err.Error())
return
}

for _, datapoint := range perfdata {
if datapoint.Label == "otlpmetricswriter_otlp_metrics_work_queue_items" {
ch <- prometheus.MustNewConstMetric(collector.otlpmetricswriter_otlp_metrics_work_queue_items, prometheus.GaugeValue, datapoint.Value)
}

if datapoint.Label == "otlpmetricswriter_otlp_metrics_work_queue_item_rate" {
ch <- prometheus.MustNewConstMetric(collector.otlpmetricswriter_otlp_metrics_work_queue_item_rate, prometheus.GaugeValue, datapoint.Value)
}

if datapoint.Label == "otlpmetricswriter_otlp_metrics_data_buffer_items" {
ch <- prometheus.MustNewConstMetric(collector.otlpmetricswriter_otlp_metrics_data_buffer_items, prometheus.GaugeValue, datapoint.Value)
}

if datapoint.Label == "otlpmetricswriter_otlp_metrics_data_buffer_bytes" {
ch <- prometheus.MustNewConstMetric(collector.otlpmetricswriter_otlp_metrics_data_buffer_bytes, prometheus.GaugeValue, datapoint.Value)
}
}
}