Skip to content
Open
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
10 changes: 10 additions & 0 deletions operator/internal/metrics/lokistack.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package metrics

import (
"context"
"slices"

"github.com/go-logr/logr"
"github.com/prometheus/client_golang/prometheus"
Expand Down Expand Up @@ -73,6 +74,15 @@ func (l *lokiStackCollector) Collect(m chan<- prometheus.Metric) {

m <- prometheus.MustNewConstMetric(lokiStackInfoDesc, prometheus.GaugeValue, 1.0, labels...)

// Main condition should always be present to make things like alerts easier to write.
conditionInDefault := []lokiv1.LokiStackConditionType{lokiv1.ConditionFailed, lokiv1.ConditionReady, lokiv1.ConditionPending}
for _, c := range conditionInDefault {
if !slices.ContainsFunc(stack.Status.Conditions, func(cond metav1.Condition) bool { return cond.Type == string(c) }) {
m <- prometheus.MustNewConstMetric(lokiStackConditionsCountDesc, prometheus.GaugeValue, 0.0, append(labels, string(c), string(lokiv1.ReasonFailedComponents), "true")...)
m <- prometheus.MustNewConstMetric(lokiStackConditionsCountDesc, prometheus.GaugeValue, 1.0, append(labels, string(c), string(lokiv1.ReasonFailedComponents), "false")...)
}
}

for _, c := range stack.Status.Conditions {
activeValue := 0.0
if c.Status == metav1.ConditionTrue {
Expand Down
16 changes: 16 additions & 0 deletions operator/internal/metrics/lokistack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ func TestLokiStackMetricsCollect(t *testing.T) {
wantMetrics: `# HELP lokistack_info Information about deployed LokiStack instances. Value is always 1.
# TYPE lokistack_info gauge
lokistack_info{size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace"} 1
# HELP lokistack_status_condition Counts the current status conditions of the LokiStack.
# TYPE lokistack_status_condition gauge
lokistack_status_condition{condition="Failed",reason="FailedComponents",size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Failed",reason="FailedComponents",size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Pending",reason="FailedComponents",size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Pending",reason="FailedComponents",size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Ready",reason="FailedComponents",size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Ready",reason="FailedComponents",size="1x.demo",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
`,
},
{
Expand Down Expand Up @@ -90,6 +98,12 @@ lokistack_info{size="1x.demo",stack_name="test-stack",stack_namespace="test-name
lokistack_info{size="1x.small",stack_name="test-stack",stack_namespace="test-namespace"} 1
# HELP lokistack_status_condition Counts the current status conditions of the LokiStack.
# TYPE lokistack_status_condition gauge
lokistack_status_condition{condition="Failed",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Failed",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Pending",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Pending",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Ready",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Ready",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Warning",reason="StorageNeedsSchemaUpdate",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 0
lokistack_status_condition{condition="Warning",reason="StorageNeedsSchemaUpdate",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 1
`,
Expand Down Expand Up @@ -134,6 +148,8 @@ lokistack_status_condition{condition="Warning",reason="StorageNeedsSchemaUpdate"
lokistack_info{size="1x.small",stack_name="test-stack",stack_namespace="test-namespace"} 1
# HELP lokistack_status_condition Counts the current status conditions of the LokiStack.
# TYPE lokistack_status_condition gauge
lokistack_status_condition{condition="Failed",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Failed",reason="FailedComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Pending",reason="PendingComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 1
lokistack_status_condition{condition="Pending",reason="PendingComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="true"} 0
lokistack_status_condition{condition="Ready",reason="ReadyComponents",size="1x.small",stack_name="test-stack",stack_namespace="test-namespace",status="false"} 0
Expand Down
Loading