diff --git a/internal/collector/nginxplusreceiver/documentation.md b/internal/collector/nginxplusreceiver/documentation.md index 67fc5abb3..3d8a93887 100644 --- a/internal/collector/nginxplusreceiver/documentation.md +++ b/internal/collector/nginxplusreceiver/documentation.md @@ -144,6 +144,13 @@ The total number of client requests received, since the last collection interval | ---- | ----------- | ---------- | | requests | Gauge | Int | +#### Attributes + +| Name | Description | Values | +| ---- | ----------- | ------ | +| nginx.zone.name | The name of the shared memory zone. | Any Str | +| nginx.zone.type | The type of shared memory zone, depending on what block it was defined in the NGINX configuration. | Str: ``SERVER``, ``LOCATION`` | + ### nginx.http.request.discarded The total number of requests completed without sending a response. diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go index e812fe359..83c262af7 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics.go @@ -1173,9 +1173,10 @@ func (m *metricNginxHTTPRequestCount) init() { m.data.SetDescription("The total number of client requests received, since the last collection interval.") m.data.SetUnit("requests") m.data.SetEmptyGauge() + m.data.Gauge().DataPoints().EnsureCapacity(m.capacity) } -func (m *metricNginxHTTPRequestCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64) { +func (m *metricNginxHTTPRequestCount) recordDataPoint(start pcommon.Timestamp, ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxZoneTypeAttributeValue string) { if !m.config.Enabled { return } @@ -1183,6 +1184,8 @@ func (m *metricNginxHTTPRequestCount) recordDataPoint(start pcommon.Timestamp, t dp.SetStartTimestamp(start) dp.SetTimestamp(ts) dp.SetIntValue(val) + dp.Attributes().PutStr("nginx.zone.name", nginxZoneNameAttributeValue) + dp.Attributes().PutStr("nginx.zone.type", nginxZoneTypeAttributeValue) } // updateCapacity saves max length of data point slices that will be used for the slice capacity. @@ -4225,8 +4228,8 @@ func (mb *MetricsBuilder) RecordNginxHTTPLimitReqRequestsDataPoint(ts pcommon.Ti } // RecordNginxHTTPRequestCountDataPoint adds a data point to nginx.http.request.count metric. -func (mb *MetricsBuilder) RecordNginxHTTPRequestCountDataPoint(ts pcommon.Timestamp, val int64) { - mb.metricNginxHTTPRequestCount.recordDataPoint(mb.startTime, ts, val) +func (mb *MetricsBuilder) RecordNginxHTTPRequestCountDataPoint(ts pcommon.Timestamp, val int64, nginxZoneNameAttributeValue string, nginxZoneTypeAttributeValue AttributeNginxZoneType) { + mb.metricNginxHTTPRequestCount.recordDataPoint(mb.startTime, ts, val, nginxZoneNameAttributeValue, nginxZoneTypeAttributeValue.String()) } // RecordNginxHTTPRequestDiscardedDataPoint adds a data point to nginx.http.request.discarded metric. diff --git a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go index a36035d80..16aacf811 100644 --- a/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go +++ b/internal/collector/nginxplusreceiver/internal/metadata/generated_metrics_test.go @@ -106,7 +106,7 @@ func TestMetricsBuilder(t *testing.T) { defaultMetricsCount++ allMetricsCount++ - mb.RecordNginxHTTPRequestCountDataPoint(ts, 1) + mb.RecordNginxHTTPRequestCountDataPoint(ts, 1, "nginx.zone.name-val", AttributeNginxZoneTypeSERVER) defaultMetricsCount++ allMetricsCount++ @@ -497,6 +497,12 @@ func TestMetricsBuilder(t *testing.T) { assert.Equal(t, ts, dp.Timestamp()) assert.Equal(t, pmetric.NumberDataPointValueTypeInt, dp.ValueType()) assert.Equal(t, int64(1), dp.IntValue()) + attrVal, ok := dp.Attributes().Get("nginx.zone.name") + assert.True(t, ok) + assert.Equal(t, "nginx.zone.name-val", attrVal.Str()) + attrVal, ok = dp.Attributes().Get("nginx.zone.type") + assert.True(t, ok) + assert.Equal(t, "SERVER", attrVal.Str()) case "nginx.http.request.discarded": assert.False(t, validatedMetrics["nginx.http.request.discarded"], "Found a duplicate in the metrics slice: nginx.http.request.discarded") validatedMetrics["nginx.http.request.discarded"] = true diff --git a/internal/collector/nginxplusreceiver/metadata.yaml b/internal/collector/nginxplusreceiver/metadata.yaml index 9b3fb2597..9e8d93724 100644 --- a/internal/collector/nginxplusreceiver/metadata.yaml +++ b/internal/collector/nginxplusreceiver/metadata.yaml @@ -173,6 +173,9 @@ metrics: gauge: value_type: int unit: "requests" + attributes: + - nginx.zone.name + - nginx.zone.type nginx.cache.bytes_read: enabled: true description: The total number of bytes read from the cache or proxied server. diff --git a/internal/collector/nginxplusreceiver/scraper.go b/internal/collector/nginxplusreceiver/scraper.go index bbf3285fe..e677e2451 100644 --- a/internal/collector/nginxplusreceiver/scraper.go +++ b/internal/collector/nginxplusreceiver/scraper.go @@ -42,6 +42,8 @@ const ( type NginxPlusScraper struct { previousServerZoneResponses map[string]ResponseStatuses previousLocationZoneResponses map[string]ResponseStatuses + previousServerZoneRequests map[string]int64 + previousLocationZoneRequests map[string]int64 plusClient *plusapi.NginxClient cfg *Config mb *metadata.MetricsBuilder @@ -137,6 +139,8 @@ func (nps *NginxPlusScraper) Scrape(ctx context.Context) (pmetric.Metrics, error nps.previousHTTPRequestsTotal = stats.HTTPRequests.Total nps.createPreviousServerZoneResponses(stats) nps.createPreviousLocationZoneResponses(stats) + nps.createPreviousServerZoneRequests(stats) + nps.createPreviousLocationZoneRequests(stats) }) stats, err := nps.plusClient.GetStats(ctx) @@ -175,6 +179,22 @@ func (nps *NginxPlusScraper) createPreviousLocationZoneResponses(stats *plusapi. nps.previousLocationZoneResponses = previousLocationZoneResponses } +func (nps *NginxPlusScraper) createPreviousServerZoneRequests(stats *plusapi.Stats) { + previousServerZoneRequests := make(map[string]int64) + for szName, sz := range stats.ServerZones { + previousServerZoneRequests[szName] = int64(sz.Requests) + } + nps.previousServerZoneRequests = previousServerZoneRequests +} + +func (nps *NginxPlusScraper) createPreviousLocationZoneRequests(stats *plusapi.Stats) { + previousLocationZoneRequests := make(map[string]int64) + for lzName, lz := range stats.LocationZones { + previousLocationZoneRequests[lzName] = lz.Requests + } + nps.previousLocationZoneRequests = previousLocationZoneRequests +} + func (nps *NginxPlusScraper) createPreviousServerZoneResponses(stats *plusapi.Stats) { previousServerZoneResponses := make(map[string]ResponseStatuses) for szName, sz := range stats.ServerZones { @@ -224,7 +244,7 @@ func (nps *NginxPlusScraper) recordMetrics(stats *plusapi.Stats) { nps.mb.RecordNginxHTTPRequestsDataPoint(now, int64(stats.HTTPRequests.Total), "", 0) requestsDiff := int64(stats.HTTPRequests.Total) - int64(nps.previousHTTPRequestsTotal) - nps.mb.RecordNginxHTTPRequestCountDataPoint(now, requestsDiff) + nps.mb.RecordNginxHTTPRequestCountDataPoint(now, requestsDiff, "", 0) nps.previousHTTPRequestsTotal = stats.HTTPRequests.Total nps.recordCacheMetrics(stats, now) @@ -866,6 +886,13 @@ func (nps *NginxPlusScraper) recordServerZoneMetrics(stats *plusapi.Stats, now p nps.mb.RecordNginxHTTPRequestsDataPoint(now, int64(sz.Requests), szName, metadata.AttributeNginxZoneTypeSERVER) + nps.mb.RecordNginxHTTPRequestCountDataPoint(now, + int64(sz.Requests)-nps.previousServerZoneRequests[szName], + szName, + metadata.AttributeNginxZoneTypeSERVER, + ) + nps.previousServerZoneRequests[szName] = int64(sz.Requests) + nps.recordServerZoneHTTPMetrics(sz, szName, now) nps.mb.RecordNginxHTTPRequestDiscardedDataPoint(now, int64(sz.Discarded), @@ -975,6 +1002,14 @@ func (nps *NginxPlusScraper) recordLocationZoneMetrics(stats *plusapi.Stats, now metadata.AttributeNginxZoneTypeLOCATION, ) + nps.mb.RecordNginxHTTPRequestCountDataPoint(now, + lz.Requests-nps.previousLocationZoneRequests[lzName], + lzName, + metadata.AttributeNginxZoneTypeLOCATION, + ) + + nps.previousLocationZoneRequests[lzName] = lz.Requests + nps.recordLocationZoneHTTPMetrics(lz, lzName, now) nps.mb.RecordNginxHTTPRequestDiscardedDataPoint(now, lz.Discarded, diff --git a/internal/collector/nginxplusreceiver/scraper_test.go b/internal/collector/nginxplusreceiver/scraper_test.go index 26aa45a69..954a0ad8e 100644 --- a/internal/collector/nginxplusreceiver/scraper_test.go +++ b/internal/collector/nginxplusreceiver/scraper_test.go @@ -58,6 +58,14 @@ func TestScraper(t *testing.T) { }, } + scraper.previousLocationZoneRequests = map[string]int64{ + "location_test": 30, // 5 + } + + scraper.previousServerZoneRequests = map[string]int64{ + "test": 29, // 3 + } + scraper.previousHTTPRequestsTotal = 3 actualMetrics, err := scraper.Scrape(context.Background()) diff --git a/internal/collector/nginxplusreceiver/testdata/expected.yaml b/internal/collector/nginxplusreceiver/testdata/expected.yaml index 724ed78d5..14e87717d 100644 --- a/internal/collector/nginxplusreceiver/testdata/expected.yaml +++ b/internal/collector/nginxplusreceiver/testdata/expected.yaml @@ -297,6 +297,31 @@ resourceMetrics: dataPoints: - asInt: "44" timeUnixNano: "1000000" + attributes: + - key: nginx.zone.name + value: + stringValue: "" + - key: nginx.zone.type + value: + stringValue: "" + - asInt: "3" + attributes: + - key: nginx.zone.name + value: + stringValue: test + - key: nginx.zone.type + value: + stringValue: SERVER + timeUnixNano: "1000000" + - asInt: "4" + attributes: + - key: nginx.zone.name + value: + stringValue: location_test + - key: nginx.zone.type + value: + stringValue: LOCATION + timeUnixNano: "1000000" isMonotonic: true unit: requests - description: The total number of bytes read from the cache or proxied server. diff --git a/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json b/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json index 193ea7468..329779b4e 100644 --- a/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json +++ b/test/mock/collector/grafana/provisioning/dashboards/nginx-plus-dashboard.json @@ -85,7 +85,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -116,7 +116,7 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "datasource": { @@ -151,6 +151,7 @@ "mode": "palette-classic" }, "custom": { + "axisPlacement": "auto", "fillOpacity": 70, "hideFrom": { "legend": false, @@ -165,7 +166,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 } ] } @@ -224,7 +225,7 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "datasource": { @@ -266,7 +267,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -332,7 +333,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "datasource": { @@ -385,7 +386,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -418,7 +419,7 @@ "showThresholdMarkers": true, "sizing": "auto" }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, @@ -490,7 +491,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 } ] } @@ -517,7 +518,7 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "datasource": { @@ -557,7 +558,7 @@ "steps": [ { "color": "semi-dark-red", - "value": null + "value": 0 }, { "color": "dark-green", @@ -616,7 +617,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "datasource": { @@ -652,7 +653,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -694,7 +695,7 @@ "sizing": "auto", "valueMode": "color" }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, @@ -744,7 +745,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -786,7 +787,7 @@ "sizing": "auto", "valueMode": "color" }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, @@ -821,39 +822,64 @@ }, { "datasource": { + "default": true, "type": "prometheus", "uid": "otel-prometheus-scraper" }, - "description": "The total number of requests completed without sending a response.", + "description": "The total number of client requests received, since last collection interval", "fieldConfig": { "defaults": { "color": { - "mode": "continuous-BlPu" + "mode": "thresholds" }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "semi-dark-red", + "value": 0 }, { - "color": "red", - "value": 80 + "color": "dark-green", + "value": 1 } ] } }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": " " + }, + "properties": [ + { + "id": "displayName", + "value": "Total" + } + ] + }, + { + "matcher": { + "id": "byValue", + "options": { + "op": "gte", + "reducer": "allIsZero", + "value": 0 + } + }, + "properties": [] + } + ] }, "gridPos": { "h": 8, - "w": 8, - "x": 16, + "w": 6, + "x": 18, "y": 20 }, - "id": 14, + "id": 66, "options": { "colorMode": "value", "graphMode": "area", @@ -871,19 +897,8 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ - { - "disableTextWrap": false, - "editorMode": "builder", - "expr": "nginx_http_request_discarded{instance_type=\"nginxplus\", nginx_zone_type=\"SERVER\", nginx_zone_name=~\"$nginxServerZoneName\"}", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "{{nginx_zone_type}} {{nginx_zone_name}}", - "range": true, - "refId": "A", - "useBackend": false - }, { "datasource": { "type": "prometheus", @@ -891,17 +906,18 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "nginx_http_request_discarded{instance_type=\"nginxplus\", nginx_zone_type=\"LOCATION\", nginx_zone_name=~\"$nginxLocationZoneName\"}", + "expr": "nginx_http_request_count{instance_type=\"nginxplus\"}", "fullMetaSearch": false, "hide": false, "includeNullMetadata": true, + "instant": false, "legendFormat": "{{nginx_zone_type}} {{nginx_zone_name}}", "range": true, - "refId": "B", + "refId": "A", "useBackend": false } ], - "title": "HTTP Requests Discarded", + "title": "HTTP Request Count", "type": "stat" }, { @@ -954,7 +970,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -985,7 +1001,7 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, @@ -1007,7 +1023,92 @@ "type": "prometheus", "uid": "otel-prometheus-scraper" }, - "description": "The total number of responses for ServerZone, grouped by status code range.", + "description": "The total number of requests completed without sending a response.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlPu" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 28 + }, + "id": 14, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.1.1", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_request_discarded{instance_type=\"nginxplus\", nginx_zone_type=\"SERVER\", nginx_zone_name=~\"$nginxServerZoneName\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{nginx_zone_type}} {{nginx_zone_name}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_http_request_discarded{instance_type=\"nginxplus\", nginx_zone_type=\"LOCATION\", nginx_zone_name=~\"$nginxLocationZoneName\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "legendFormat": "{{nginx_zone_type}} {{nginx_zone_name}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "HTTP Requests Discarded", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "otel-prometheus-scraper" + }, + "description": "The total number of HTTP responses sent to clients since the last collection interval, grouped by status code range.", "fieldConfig": { "defaults": { "color": { @@ -1052,7 +1153,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -1066,10 +1167,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 28 + "x": 0, + "y": 35 }, - "id": 7, + "id": 8, "options": { "legend": { "calcs": [], @@ -1083,12 +1184,12 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, "editorMode": "builder", - "expr": "nginx_http_response_status{nginx_zone_type=\"SERVER\", nginx_zone_name=~\"$nginxServerZoneName\"}", + "expr": "nginx_http_response_count{nginx_zone_type=\"LOCATION\", nginx_zone_name=~\"$nginxLocationZoneName\"}", "fullMetaSearch": false, "includeNullMetadata": true, "legendFormat": "Status Range: {{nginx_status_range}} {{nginx_zone_name}}", @@ -1097,7 +1198,7 @@ "useBackend": false } ], - "title": "HTTP Response Status - ServerZone", + "title": "HTTP Response Count - LocationZone", "type": "timeseries" }, { @@ -1105,7 +1206,7 @@ "type": "prometheus", "uid": "otel-prometheus-scraper" }, - "description": "The total number of HTTP responses sent to clients since the last collection interval, grouped by status code range.", + "description": "The total number of responses for ServerZone, grouped by status code range.", "fieldConfig": { "defaults": { "color": { @@ -1150,7 +1251,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 }, { "color": "red", @@ -1164,10 +1265,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 35 + "x": 12, + "y": 36 }, - "id": 8, + "id": 7, "options": { "legend": { "calcs": [], @@ -1181,12 +1282,12 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, "editorMode": "builder", - "expr": "nginx_http_response_count{nginx_zone_type=\"LOCATION\", nginx_zone_name=~\"$nginxLocationZoneName\"}", + "expr": "nginx_http_response_status{nginx_zone_type=\"SERVER\", nginx_zone_name=~\"$nginxServerZoneName\"}", "fullMetaSearch": false, "includeNullMetadata": true, "legendFormat": "Status Range: {{nginx_status_range}} {{nginx_zone_name}}", @@ -1195,7 +1296,7 @@ "useBackend": false } ], - "title": "HTTP Response Count - LocationZone", + "title": "HTTP Response Status - ServerZone", "type": "timeseries" }, { @@ -1248,7 +1349,7 @@ "steps": [ { "color": "green", - "value": null + "value": 0 } ] } @@ -1259,7 +1360,7 @@ "h": 7, "w": 12, "x": 12, - "y": 35 + "y": 43 }, "id": 9, "options": { @@ -1275,7 +1376,7 @@ "sort": "none" } }, - "pluginVersion": "11.5.2", + "pluginVersion": "12.1.1", "targets": [ { "disableTextWrap": false, @@ -1298,7 +1399,7 @@ "h": 1, "w": 24, "x": 0, - "y": 42 + "y": 50 }, "id": 11, "panels": [], @@ -1321,8 +1422,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] } @@ -1333,7 +1433,7 @@ "h": 6, "w": 5, "x": 0, - "y": 43 + "y": 51 }, "id": 18, "options": { @@ -1391,8 +1491,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "orange", @@ -1407,7 +1506,7 @@ "h": 6, "w": 7, "x": 5, - "y": 43 + "y": 51 }, "id": 32, "options": { @@ -1459,8 +1558,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] } @@ -1561,7 +1659,7 @@ "h": 18, "w": 12, "x": 12, - "y": 43 + "y": 51 }, "id": 59, "maxDataPoints": 10, @@ -1702,8 +1800,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] } @@ -1714,7 +1811,7 @@ "h": 6, "w": 5, "x": 0, - "y": 49 + "y": 57 }, "id": 17, "options": { @@ -1771,8 +1868,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "light-red", @@ -1787,7 +1883,7 @@ "h": 6, "w": 7, "x": 5, - "y": 49 + "y": 57 }, "id": 28, "options": { @@ -1871,8 +1967,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -1887,7 +1982,7 @@ "h": 8, "w": 12, "x": 0, - "y": 55 + "y": 63 }, "id": 22, "options": { @@ -1937,8 +2032,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2043,7 +2137,7 @@ "h": 15, "w": 12, "x": 12, - "y": 61 + "y": 69 }, "id": 27, "maxDataPoints": 10, @@ -2190,8 +2284,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "#EAB839", @@ -2206,7 +2299,7 @@ "h": 7, "w": 12, "x": 0, - "y": 63 + "y": 71 }, "id": 20, "options": { @@ -2292,8 +2385,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2308,7 +2400,7 @@ "h": 9, "w": 12, "x": 0, - "y": 70 + "y": 78 }, "id": 24, "options": { @@ -2390,8 +2482,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2406,7 +2497,7 @@ "h": 12, "w": 12, "x": 12, - "y": 76 + "y": 84 }, "id": 25, "options": { @@ -2488,8 +2579,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2504,7 +2594,7 @@ "h": 10, "w": 12, "x": 0, - "y": 79 + "y": 87 }, "id": 26, "options": { @@ -2586,8 +2676,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2602,7 +2691,7 @@ "h": 9, "w": 12, "x": 12, - "y": 88 + "y": 96 }, "id": 30, "options": { @@ -2684,8 +2773,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2700,7 +2788,7 @@ "h": 8, "w": 6, "x": 0, - "y": 89 + "y": 97 }, "id": 23, "options": { @@ -2782,8 +2870,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2798,7 +2885,7 @@ "h": 8, "w": 6, "x": 6, - "y": 89 + "y": 97 }, "id": 60, "options": { @@ -2847,8 +2934,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] } @@ -2859,7 +2945,7 @@ "h": 9, "w": 5, "x": 0, - "y": 97 + "y": 105 }, "id": 29, "options": { @@ -2945,8 +3031,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -2961,7 +3046,7 @@ "h": 9, "w": 9, "x": 5, - "y": 97 + "y": 105 }, "id": 31, "options": { @@ -3043,8 +3128,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3059,7 +3143,7 @@ "h": 9, "w": 10, "x": 14, - "y": 97 + "y": 105 }, "id": 21, "options": { @@ -3098,7 +3182,7 @@ "h": 1, "w": 24, "x": 0, - "y": 106 + "y": 114 }, "id": 10, "panels": [], @@ -3154,8 +3238,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3170,7 +3253,7 @@ "h": 8, "w": 12, "x": 0, - "y": 107 + "y": 115 }, "id": 37, "options": { @@ -3252,8 +3335,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3268,7 +3350,7 @@ "h": 8, "w": 12, "x": 12, - "y": 107 + "y": 115 }, "id": 38, "options": { @@ -3352,8 +3434,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3368,7 +3449,7 @@ "h": 8, "w": 12, "x": 0, - "y": 115 + "y": 123 }, "id": 34, "options": { @@ -3450,8 +3531,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3466,7 +3546,7 @@ "h": 8, "w": 12, "x": 12, - "y": 115 + "y": 123 }, "id": 35, "options": { @@ -3548,8 +3628,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3564,7 +3643,7 @@ "h": 10, "w": 12, "x": 0, - "y": 123 + "y": 131 }, "id": 36, "options": { @@ -3646,8 +3725,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3662,7 +3740,7 @@ "h": 10, "w": 12, "x": 12, - "y": 123 + "y": 131 }, "id": 61, "options": { @@ -3701,7 +3779,7 @@ "h": 1, "w": 24, "x": 0, - "y": 133 + "y": 141 }, "id": 39, "panels": [], @@ -3733,8 +3811,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3749,7 +3826,7 @@ "h": 8, "w": 12, "x": 0, - "y": 134 + "y": 142 }, "id": 40, "maxDataPoints": 10, @@ -3830,8 +3907,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3846,7 +3922,7 @@ "h": 8, "w": 12, "x": 12, - "y": 134 + "y": 142 }, "id": 41, "options": { @@ -3881,7 +3957,7 @@ "h": 1, "w": 24, "x": 0, - "y": 142 + "y": 150 }, "id": 42, "panels": [], @@ -3904,8 +3980,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3920,7 +3995,7 @@ "h": 6, "w": 9, "x": 0, - "y": 143 + "y": 151 }, "id": 43, "options": { @@ -3980,8 +4055,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -3996,7 +4070,7 @@ "h": 12, "w": 5, "x": 9, - "y": 143 + "y": 151 }, "id": 45, "options": { @@ -4047,8 +4121,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4063,7 +4136,7 @@ "h": 6, "w": 10, "x": 14, - "y": 143 + "y": 151 }, "id": 62, "options": { @@ -4123,8 +4196,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4139,7 +4211,7 @@ "h": 6, "w": 9, "x": 0, - "y": 149 + "y": 157 }, "id": 44, "options": { @@ -4199,8 +4271,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4215,7 +4286,7 @@ "h": 6, "w": 10, "x": 14, - "y": 149 + "y": 157 }, "id": 46, "options": { @@ -4275,8 +4346,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4291,7 +4361,7 @@ "h": 8, "w": 24, "x": 0, - "y": 155 + "y": 163 }, "id": 47, "options": { @@ -4353,8 +4423,7 @@ "mode": "absolute", "steps": [ { - "color": "#58585a", - "value": null + "color": "#58585a" }, { "color": "green", @@ -4369,7 +4438,7 @@ "h": 9, "w": 10, "x": 0, - "y": 163 + "y": 171 }, "id": 48, "maxDataPoints": 10, @@ -4454,8 +4523,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4470,7 +4538,7 @@ "h": 9, "w": 7, "x": 10, - "y": 163 + "y": 171 }, "id": 50, "options": { @@ -4552,8 +4620,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4568,7 +4635,7 @@ "h": 9, "w": 7, "x": 17, - "y": 163 + "y": 171 }, "id": 49, "options": { @@ -4618,8 +4685,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" } ] } @@ -4720,7 +4786,7 @@ "h": 16, "w": 12, "x": 0, - "y": 172 + "y": 180 }, "id": 64, "maxDataPoints": 10, @@ -4893,8 +4959,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -4909,7 +4974,7 @@ "h": 8, "w": 12, "x": 12, - "y": 172 + "y": 180 }, "id": 52, "options": { @@ -4991,8 +5056,7 @@ "mode": "absolute", "steps": [ { - "color": "green", - "value": null + "color": "green" }, { "color": "red", @@ -5007,7 +5071,7 @@ "h": 8, "w": 12, "x": 12, - "y": 180 + "y": 188 }, "id": 57, "options": { @@ -5162,7 +5226,7 @@ "h": 16, "w": 12, "x": 0, - "y": 188 + "y": 196 }, "id": 65, "maxDataPoints": 10, @@ -5357,7 +5421,7 @@ "h": 16, "w": 7, "x": 12, - "y": 188 + "y": 196 }, "id": 58, "options": { @@ -5454,7 +5518,7 @@ "h": 8, "w": 5, "x": 19, - "y": 188 + "y": 196 }, "id": 54, "options": { @@ -5518,7 +5582,7 @@ "h": 8, "w": 5, "x": 19, - "y": 196 + "y": 204 }, "id": 56, "options": { @@ -5619,7 +5683,7 @@ "h": 8, "w": 12, "x": 0, - "y": 204 + "y": 212 }, "id": 53, "options": { @@ -5716,7 +5780,7 @@ "h": 8, "w": 12, "x": 12, - "y": 204 + "y": 212 }, "id": 63, "options": { @@ -5752,7 +5816,7 @@ ], "preload": false, "refresh": "5s", - "schemaVersion": 40, + "schemaVersion": 41, "tags": [], "templating": { "list": [ @@ -5948,6 +6012,5 @@ "timezone": "browser", "title": "NGINX Plus", "uid": "fdris4hclbqiob", - "version": 20, - "weekStart": "" + "version": 9 }