Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: mvtx gauge metrics support #2259

Merged
merged 3 commits into from
Dec 10, 2024
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
29 changes: 28 additions & 1 deletion config/advanced-install/namespaced-numaflow-server.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,39 @@ metadata:
---
apiVersion: v1
data:
config.yaml: |-
config.yaml: |
# url is a required field, it should be the url of the service to which the metrics proxy will connect
# url: service_name + "." + service_namespace + ".svc.cluster.local" + ":" + port
# example for local prometheus service
# url: http://prometheus-operated.monitoring.svc.cluster.local:9090
patterns:
- name: mono_vertex_gauge
object: mono-vertex
title: Pending Messages Lag
description: This query is the total number of pending messages for the mono vertex
expr: |
$metric_name{$filters}
params:
- name: start_time
required: false
- name: end_time
required: false
metrics:
- metric_name: monovtx_pending
required_filters:
- namespace
- mvtx_name
dimensions:
- name: pod
filters:
- name: pod
required: false
- name: period
required: false
- name: mono-vertex
filters:
- name: period
required: false
- name: mono_vertex_histogram
object: mono-vertex
title: Processing Time Latency
Expand Down
29 changes: 28 additions & 1 deletion config/advanced-install/numaflow-server.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,39 @@ metadata:
---
apiVersion: v1
data:
config.yaml: |-
config.yaml: |
# url is a required field, it should be the url of the service to which the metrics proxy will connect
# url: service_name + "." + service_namespace + ".svc.cluster.local" + ":" + port
# example for local prometheus service
# url: http://prometheus-operated.monitoring.svc.cluster.local:9090
patterns:
- name: mono_vertex_gauge
object: mono-vertex
title: Pending Messages Lag
description: This query is the total number of pending messages for the mono vertex
expr: |
$metric_name{$filters}
params:
- name: start_time
required: false
- name: end_time
required: false
metrics:
- metric_name: monovtx_pending
required_filters:
- namespace
- mvtx_name
dimensions:
- name: pod
filters:
- name: pod
required: false
- name: period
required: false
- name: mono-vertex
filters:
- name: period
required: false
- name: mono_vertex_histogram
object: mono-vertex
title: Processing Time Latency
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,33 @@ data:
# example for local prometheus service
# url: http://prometheus-operated.monitoring.svc.cluster.local:9090
patterns:
- name: mono_vertex_gauge
object: mono-vertex
title: Pending Messages Lag
description: This query is the total number of pending messages for the mono vertex
expr: |
$metric_name{$filters}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will be adding support for operation like max, min or avg in query expression.

params:
- name: start_time
required: false
- name: end_time
required: false
metrics:
- metric_name: monovtx_pending
required_filters:
- namespace
- mvtx_name
dimensions:
- name: pod
filters:
- name: pod
required: false
- name: period
required: false
- name: mono-vertex
filters:
- name: period
required: false
- name: mono_vertex_histogram
object: mono-vertex
title: Processing Time Latency
Expand Down Expand Up @@ -77,4 +104,4 @@ data:
- name: pod
filters:
- name: pod
required: false
required: false
29 changes: 28 additions & 1 deletion config/install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28557,12 +28557,39 @@ metadata:
---
apiVersion: v1
data:
config.yaml: |-
config.yaml: |
# url is a required field, it should be the url of the service to which the metrics proxy will connect
# url: service_name + "." + service_namespace + ".svc.cluster.local" + ":" + port
# example for local prometheus service
# url: http://prometheus-operated.monitoring.svc.cluster.local:9090
patterns:
- name: mono_vertex_gauge
object: mono-vertex
title: Pending Messages Lag
description: This query is the total number of pending messages for the mono vertex
expr: |
$metric_name{$filters}
params:
- name: start_time
required: false
- name: end_time
required: false
metrics:
- metric_name: monovtx_pending
required_filters:
- namespace
- mvtx_name
dimensions:
- name: pod
filters:
- name: pod
required: false
- name: period
required: false
- name: mono-vertex
filters:
- name: period
required: false
- name: mono_vertex_histogram
object: mono-vertex
title: Processing Time Latency
Expand Down
29 changes: 28 additions & 1 deletion config/namespace-install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28445,12 +28445,39 @@ metadata:
---
apiVersion: v1
data:
config.yaml: |-
config.yaml: |
# url is a required field, it should be the url of the service to which the metrics proxy will connect
# url: service_name + "." + service_namespace + ".svc.cluster.local" + ":" + port
# example for local prometheus service
# url: http://prometheus-operated.monitoring.svc.cluster.local:9090
patterns:
- name: mono_vertex_gauge
object: mono-vertex
title: Pending Messages Lag
description: This query is the total number of pending messages for the mono vertex
expr: |
$metric_name{$filters}
params:
- name: start_time
required: false
- name: end_time
required: false
metrics:
- metric_name: monovtx_pending
required_filters:
- namespace
- mvtx_name
dimensions:
- name: pod
filters:
- name: pod
required: false
- name: period
required: false
- name: mono-vertex
filters:
- name: period
required: false
- name: mono_vertex_histogram
object: mono-vertex
title: Processing Time Latency
Expand Down
87 changes: 87 additions & 0 deletions server/apis/v1/promql_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,70 @@ func Test_PromQueryBuilder(t *testing.T) {
}
})
}

// tests for gauge metrics
var gauge_service = &PromQlService{
PlaceHolders: map[string]map[string][]string{
"monovtx_pending": {
"mono-vertex": {"$dimension", "$metric_name", "$filters"},
},
},
Expression: map[string]map[string]string{
"monovtx_pending": {
"mono-vertex": "$metric_name{$filters}",
},
},
}

gauge_metrics_tests := []struct {
name string
requestBody MetricsRequestBody
expectedQuery string
expectError bool
}{
{
name: "Successful gauge metrics template substitution",
requestBody: MetricsRequestBody{
MetricName: "monovtx_pending",
Dimension: "mono-vertex",
Filters: map[string]string{
"namespace": "test_namespace",
"mvtx_name": "test_mvtx",
"period": "5m",
},
},
expectedQuery: `monovtx_pending{namespace= "test_namespace", mvtx_name= "test_mvtx", period= "5m"}`,
},
{
name: "Missing metric name in service config",
requestBody: MetricsRequestBody{
MetricName: "non_existent_metric",
Dimension: "mono-vertex",
Filters: map[string]string{
"namespace": "test_namespace",
"mvtx_name": "test_mvtx",
"period": "5m",
},
},
expectError: true,
},
}

for _, tt := range gauge_metrics_tests {
t.Run(tt.name, func(t *testing.T) {
actualQuery, err := gauge_service.BuildQuery(tt.requestBody)
if tt.expectError {
assert.Error(t, err)
} else {
assert.NoError(t, err)
if !comparePrometheusQueries(tt.expectedQuery, actualQuery) {
t.Errorf("Prometheus queries do not match.\nExpected: %s\nGot: %s", tt.expectedQuery, actualQuery)
} else {
t.Log("Prometheus queries match!")
}
}
})
}
}

func Test_QueryPrometheus(t *testing.T) {
Expand Down Expand Up @@ -322,6 +386,29 @@ func Test_QueryPrometheus(t *testing.T) {
assert.Equal(t, 1, matrix.Len())
})

t.Run("Successful gauge query", func(t *testing.T) {
mockAPI := &MockPrometheusAPI{}
promQlService := &PromQlService{
PrometheusClient: &Prometheus{
Api: mockAPI,
},
}
query := `monovtx_pending{namespace="default", mvtx_name="test-mvtx", pending="5m"}`
startTime := time.Now().Add(-30 * time.Minute)
endTime := time.Now()

ctx := context.Background()
result, err := promQlService.QueryPrometheus(ctx, query, startTime, endTime)

assert.NoError(t, err)
assert.NotNil(t, result)

// for query range , response should be a matrix
matrix, ok := result.(model.Matrix)
assert.True(t, ok)
assert.Equal(t, 1, matrix.Len())
})

t.Run("Prometheus client is nil", func(t *testing.T) {
service := &PromQlService{
PrometheusClient: nil,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading