diff --git a/monitoring/grafana/dashboards/storage-otel.json b/monitoring/grafana/dashboards/storage-otel.json index 52690c24c..25c19b806 100644 --- a/monitoring/grafana/dashboards/storage-otel.json +++ b/monitoring/grafana/dashboards/storage-otel.json @@ -19,7 +19,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, - "id": 2, + "id": 1, "links": [], "panels": [ { @@ -1162,8 +1162,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval]))", "legendFormat": "Total", + "range": true, "refId": "A" }, { @@ -1171,8 +1173,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"2xx\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"2xx\"}[$__rate_interval]))", "legendFormat": "2xx", + "range": true, "refId": "B" }, { @@ -1180,8 +1184,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"4xx\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"4xx\"}[$__rate_interval]))", "legendFormat": "4xx", + "range": true, "refId": "C" }, { @@ -1189,8 +1195,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"5xx\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"5xx\"}[$__rate_interval]))", "legendFormat": "5xx", + "range": true, "refId": "D" } ], @@ -1395,8 +1403,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"5xx\"}[$__rate_interval])) / sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"5xx\"}[$__rate_interval])) / sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval]))", "legendFormat": "Error Rate", + "range": true, "refId": "A" } ], @@ -1634,7 +1644,8 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "topk(10, sum by (route) (rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval])))", + "editorMode": "code", + "expr": "topk(10, sum by (route) (rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval])))", "format": "table", "instant": true, "legendFormat": "__auto", @@ -1773,8 +1784,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"4xx\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"4xx\"}[$__rate_interval]))", "legendFormat": "4xx Errors", + "range": true, "refId": "A" }, { @@ -1782,8 +1795,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"5xx\"}[$__rate_interval]))", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"5xx\"}[$__rate_interval]))", "legendFormat": "5xx Errors", + "range": true, "refId": "B" } ], @@ -1891,7 +1906,8 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "topk(10, sum by (route) (rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", status_code=~\"4xx|5xx\"}[$__rate_interval])))", + "editorMode": "code", + "expr": "topk(10, sum by (route) (rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", status_code=~\"4xx|5xx\"}[$__rate_interval])))", "format": "table", "instant": true, "legendFormat": "__auto", @@ -2012,8 +2028,10 @@ "type": "prometheus", "uid": "local_prometheus" }, - "expr": "sum(rate(storage_api_otel_http_requests_total{region=~\"$region\", instance=~\"$instance\", tenantId=~\"$tenant\"}[$__rate_interval])) by (tenantId)", + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_http_request_duration_seconds_count{region=~\"$region\", instance=~\"$instance\", tenantId=~\"$tenant\"}[$__rate_interval])) by (tenantId)", "legendFormat": "{{ tenantId }}", + "range": true, "refId": "A" } ], @@ -2841,8 +2859,10 @@ "type": "prometheus", "uid": "local_prometheus" }, + "editorMode": "code", "expr": "sum(storage_api_otel_db_pool{region=~\"$region\", instance=~\"$instance\"})", "legendFormat": "Active Pools", + "range": true, "refId": "A" } ], @@ -3691,7 +3711,7 @@ "h": 8, "w": 8, "x": 0, - "y": 145 + "y": 185 }, "id": 61, "options": { @@ -3805,7 +3825,7 @@ "h": 8, "w": 8, "x": 8, - "y": 145 + "y": 185 }, "id": 62, "options": { @@ -3916,7 +3936,7 @@ "h": 8, "w": 8, "x": 16, - "y": 145 + "y": 185 }, "id": 63, "options": { @@ -4491,7 +4511,7 @@ "type": "timeseries" }, { - "collapsed": true, + "collapsed": false, "gridPos": { "h": 1, "w": 24, @@ -4499,981 +4519,980 @@ "y": 107 }, "id": 84, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" + "panels": [], + "title": "Node.js Runtime (V8 Memory & GC)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "V8 JavaScript engine heap memory usage vs limit. Used heap approaching the limit may trigger more frequent garbage collection or out-of-memory errors. Monitor for memory leaks (steadily increasing used heap).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, - "description": "V8 JavaScript engine heap memory usage vs limit. Used heap approaching the limit may trigger more frequent garbage collection or out-of-memory errors. Monitor for memory leaks (steadily increasing used heap).", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "bytes" + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 147 - }, - "id": 85, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "sum(storage_api_otel_v8js_memory_heap_used_bytes)", - "legendFormat": "Heap Used", - "range": true, - "refId": "A" + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "sum(storage_api_otel_v8js_memory_heap_limit_bytes)", - "legendFormat": "Heap Limit", - "range": true, - "refId": "B" + "thresholdsStyle": { + "mode": "off" } - ], - "title": "V8 Heap Memory", - "type": "timeseries" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 108 + }, + "id": 85, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Garbage collection duration percentiles by GC type (minor/major/incremental). Long GC pauses can cause request latency spikes. Major GC taking >100ms may require heap size tuning or memory optimization.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "s" - }, - "overrides": [] + "editorMode": "code", + "expr": "sum(storage_api_otel_v8js_memory_heap_used_bytes)", + "legendFormat": "Heap Used", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 147 + "editorMode": "code", + "expr": "sum(storage_api_otel_v8js_memory_heap_limit_bytes)", + "legendFormat": "Heap Limit", + "range": true, + "refId": "B" + } + ], + "title": "V8 Heap Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Garbage collection duration percentiles by GC type (minor/major/incremental). Long GC pauses can cause request latency spikes. Major GC taking >100ms may require heap size tuning or memory optimization.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, - "id": 86, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(storage_api_otel_v8js_gc_duration_seconds_bucket[$__rate_interval])) by (le, v8js_gc_type))", - "legendFormat": "p50 {{ v8js_gc_type }}", - "range": true, - "refId": "A" + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(storage_api_otel_v8js_gc_duration_seconds_bucket[$__rate_interval])) by (le, v8js_gc_type))", - "legendFormat": "p99 {{ v8js_gc_type }}", - "range": true, - "refId": "B" + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ], - "title": "GC Duration by Type", - "type": "timeseries" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 108 + }, + "id": 86, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Process memory breakdown: RSS (total resident memory), External (C++ objects bound to JS), ArrayBuffers (binary data buffers). High external/arraybuffer memory may indicate large file operations or buffer leaks.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 147 - }, - "id": 87, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "storage_api_otel_nodejs_memory_rss_bytes{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "RSS", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "storage_api_otel_nodejs_memory_external_bytes{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "External", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "storage_api_otel_nodejs_memory_array_buffers_bytes{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "Array Buffers", - "range": true, - "refId": "C" - } - ], - "title": "Process Memory (RSS/External)", - "type": "timeseries" + "editorMode": "code", + "expr": "histogram_quantile(0.50, sum(rate(storage_api_otel_v8js_gc_duration_seconds_bucket[$__rate_interval])) by (le, v8js_gc_type))", + "legendFormat": "p50 {{ v8js_gc_type }}", + "range": true, + "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Rate of garbage collection operations per second by GC type. Minor GC is fast and frequent (young generation), Major GC is slower (full heap). High major GC rates may indicate memory pressure.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "ops" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 155 - }, - "id": 221, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(storage_api_otel_v8js_gc_duration_seconds_count[$__rate_interval])) by (v8js_gc_type)", - "legendFormat": "{{ v8js_gc_type }}", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "sum(rate(storage_api_otel_v8js_gc_duration_seconds_count[$__rate_interval]))", - "legendFormat": "Total", - "range": true, - "refId": "B" - } - ], - "title": "GC Rate by Type", - "type": "timeseries" + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum(rate(storage_api_otel_v8js_gc_duration_seconds_bucket[$__rate_interval])) by (le, v8js_gc_type))", + "legendFormat": "p99 {{ v8js_gc_type }}", + "range": true, + "refId": "B" } ], - "title": "Node.js Runtime (V8 Memory & GC)", - "type": "row" + "title": "GC Duration by Type", + "type": "timeseries" }, { - "collapsed": true, + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Process memory breakdown: RSS (total resident memory), External (C++ objects bound to JS), ArrayBuffers (binary data buffers). High external/arraybuffer memory may indicate large file operations or buffer leaks.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, "gridPos": { - "h": 1, - "w": 24, - "x": 0, + "h": 8, + "w": 8, + "x": 16, "y": 108 }, - "id": 88, - "panels": [ + "id": 87, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Rate of CPU time consumption split between user (application code) and system (kernel operations) time. High system CPU may indicate excessive I/O operations or syscall overhead.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 148 - }, - "id": 89, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } + "editorMode": "code", + "expr": "storage_api_otel_nodejs_memory_rss_bytes{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "RSS", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "rate(storage_api_otel_process_cpu_user_seconds_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval])", - "legendFormat": "User CPU", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "rate(storage_api_otel_process_cpu_system_seconds_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval])", - "legendFormat": "System CPU", - "range": true, - "refId": "B" - } - ], - "title": "Process CPU Time (Rate)", - "type": "timeseries" + "editorMode": "code", + "expr": "storage_api_otel_nodejs_memory_external_bytes{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "External", + "range": true, + "refId": "B" }, { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Active libuv handles (timers, sockets, file descriptors) and pending async requests. High handle counts may indicate resource leaks. Sudden spikes correlate with increased load or connection storms.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" + "editorMode": "code", + "expr": "storage_api_otel_nodejs_memory_array_buffers_bytes{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "Array Buffers", + "range": true, + "refId": "C" + } + ], + "title": "Process Memory (RSS/External)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Rate of garbage collection operations per second by GC type. Minor GC is fast and frequent (young generation), Major GC is slower (full heap). High major GC rates may indicate memory pressure.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "ops" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 116 + }, + "id": 221, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_v8js_gc_duration_seconds_count[$__rate_interval])) by (v8js_gc_type)", + "legendFormat": "{{ v8js_gc_type }}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "editorMode": "code", + "expr": "sum(rate(storage_api_otel_v8js_gc_duration_seconds_count[$__rate_interval]))", + "legendFormat": "Total", + "range": true, + "refId": "B" + } + ], + "title": "GC Rate by Type", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 124 + }, + "id": 88, + "panels": [], + "title": "Node.js Runtime (Process)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Rate of CPU time consumption split between user (application code) and system (kernel operations) time. High system CPU may indicate excessive I/O operations or syscall overhead.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 125 + }, + "id": 89, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "editorMode": "code", + "expr": "rate(storage_api_otel_process_cpu_user_seconds_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval])", + "legendFormat": "User CPU", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "editorMode": "code", + "expr": "rate(storage_api_otel_process_cpu_system_seconds_total{region=~\"$region\", instance=~\"$instance\"}[$__rate_interval])", + "legendFormat": "System CPU", + "range": true, + "refId": "B" + } + ], + "title": "Process CPU Time (Rate)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Active libuv handles (timers, sockets, file descriptors) and pending async requests. High handle counts may indicate resource leaks. Sudden spikes correlate with increased load or connection storms.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 125 + }, + "id": 90, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "expr": "storage_api_otel_nodejs_active_handles_total{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "Active Handles", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "expr": "storage_api_otel_nodejs_active_requests_total{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "Active Requests", + "refId": "B" + } + ], + "title": "Active Handles & Requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Time spent in different event loop phases (idle, active, poll). High poll time indicates waiting for I/O. High active time indicates CPU-bound work. Useful for understanding event loop behavior.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" }, - "overrides": [] + "thresholdsStyle": { + "mode": "off" + } }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 148 + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] }, - "id": 90, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 125 + }, + "id": 91, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "editorMode": "code", + "expr": "rate(storage_api_otel_nodejs_eventloop_time_seconds_total[$__rate_interval])", + "legendFormat": "{{ nodejs_eventloop_state }}", + "range": true, + "refId": "A" + } + ], + "title": "Event Loop Time by State", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Percentage of file descriptors in use (open/max). High values (>80%) may indicate FD exhaustion risk. Monitor for leaks - a steadily increasing value without corresponding traffic increase suggests FD leaks. Only available on Linux.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "line+area" } }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 }, - "expr": "storage_api_otel_nodejs_active_handles_total{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "Active Handles", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" + { + "color": "orange", + "value": 0.7 }, - "expr": "storage_api_otel_nodejs_active_requests_total{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "Active Requests", - "refId": "B" - } - ], - "title": "Active Handles & Requests", - "type": "timeseries" + { + "color": "red", + "value": 0.9 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 133 + }, + "id": 222, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Time spent in different event loop phases (idle, active, poll). High poll time indicates waiting for I/O. High active time indicates CPU-bound work. Useful for understanding event loop behavior.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 148 + "editorMode": "code", + "expr": "storage_api_otel_process_open_fds{region=~\"$region\", instance=~\"$instance\"} / storage_api_otel_process_max_fds{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "FD Usage", + "range": true, + "refId": "A" + } + ], + "title": "Used File Descriptors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "local_prometheus" + }, + "description": "Number of open file descriptors over time. Useful for tracking FD usage patterns and identifying potential leaks. Compare with max FD limit to assess headroom. Only available on Linux.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, - "id": 91, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "showValues": false, + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "rate(storage_api_otel_nodejs_eventloop_time_seconds_total[$__rate_interval])", - "legendFormat": "{{ nodejs_eventloop_state }}", - "range": true, - "refId": "A" - } - ], - "title": "Event Loop Time by State", - "type": "timeseries" + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 133 + }, + "id": 223, + "options": { + "legend": { + "calcs": ["mean", "max"], + "displayMode": "table", + "placement": "bottom", + "showLegend": true }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.3.1", + "targets": [ { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Percentage of file descriptors in use (open/max). High values (>80%) may indicate FD exhaustion risk. Monitor for leaks - a steadily increasing value without corresponding traffic increase suggests FD leaks. Only available on Linux.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "line+area" - } - }, - "mappings": [], - "max": 1, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "orange", - "value": 0.7 - }, - { - "color": "red", - "value": 0.9 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 164 - }, - "id": 222, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "storage_api_otel_process_open_fds{region=~\"$region\", instance=~\"$instance\"} / storage_api_otel_process_max_fds{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "FD Usage", - "range": true, - "refId": "A" - } - ], - "title": "Used File Descriptors", - "type": "timeseries" + "editorMode": "code", + "expr": "storage_api_otel_process_open_fds{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "Open FDs", + "range": true, + "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "local_prometheus" }, - "description": "Number of open file descriptors over time. Useful for tracking FD usage patterns and identifying potential leaks. Compare with max FD limit to assess headroom. Only available on Linux.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "showValues": false, - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": 0 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 164 - }, - "id": 223, - "options": { - "legend": { - "calcs": ["mean", "max"], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "12.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "storage_api_otel_process_open_fds{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "Open FDs", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "local_prometheus" - }, - "editorMode": "code", - "expr": "storage_api_otel_process_max_fds{region=~\"$region\", instance=~\"$instance\"}", - "legendFormat": "Max FDs", - "range": true, - "refId": "B" - } - ], - "title": "Open File Descriptors", - "type": "timeseries" + "editorMode": "code", + "expr": "storage_api_otel_process_max_fds{region=~\"$region\", instance=~\"$instance\"}", + "legendFormat": "Max FDs", + "range": true, + "refId": "B" } ], - "title": "Node.js Runtime (Process)", - "type": "row" + "title": "Open File Descriptors", + "type": "timeseries" }, { "collapsed": false, @@ -5481,7 +5500,7 @@ "h": 1, "w": 24, "x": 0, - "y": 109 + "y": 141 }, "id": 70, "panels": [], @@ -5522,7 +5541,7 @@ { "allValue": ".*", "current": { - "text": ["All"], + "text": "All", "value": ["$__all"] }, "datasource": { @@ -5546,8 +5565,8 @@ }, { "current": { - "text": ["storage-single-tenant"], - "value": ["storage-single-tenant"] + "text": "All", + "value": ["$__all"] }, "datasource": { "type": "prometheus", @@ -5571,12 +5590,12 @@ ] }, "time": { - "from": "now-5m", - "to": "now" + "from": "2026-03-10T12:33:29.823Z", + "to": "2026-03-10T12:34:24.902Z" }, "timepicker": {}, "timezone": "browser", "title": "Storage API - OTel Metrics", "uid": "storage-otel-metrics", - "version": 1 + "version": 3 } diff --git a/package-lock.json b/package-lock.json index 67be3a96b..b04a7c53d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@aws-sdk/s3-request-presigner": "^3.979.0", "@fastify/accepts": "^5.0.4", "@fastify/multipart": "^9.4.0", + "@fastify/otel": "^0.17.1", "@fastify/rate-limit": "^10.3.0", "@fastify/swagger": "^9.7.0", "@fastify/swagger-ui": "^5.2.5", @@ -497,7 +498,6 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1003.0.tgz", "integrity": "sha512-on8GvIWeH1pD0l53NuKbPO84bEC1mk/9zskgU+dVKcVoGxOZI94fVddCJb+IwIUN6rfBHCfXPCVbgVyzsHTAVg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", @@ -2531,7 +2531,6 @@ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -5099,6 +5098,90 @@ "secure-json-parse": "^4.0.0" } }, + "node_modules/@fastify/otel": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@fastify/otel/-/otel-0.17.1.tgz", + "integrity": "sha512-K4wyxfUZx2ux5o+b6BtTqouYFVILohLZmSbA2tKUueJstNcBnoGPVhllCaOvbQ3ZrXdUxUC/fyrSWSCqHhdOPg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/semantic-conventions": "^1.28.0", + "minimatch": "^10.2.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@fastify/otel/node_modules/@opentelemetry/api-logs": { + "version": "0.212.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz", + "integrity": "sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@fastify/otel/node_modules/@opentelemetry/instrumentation": { + "version": "0.212.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.212.0.tgz", + "integrity": "sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==", + "dependencies": { + "@opentelemetry/api-logs": "0.212.0", + "import-in-the-middle": "^2.0.6", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@fastify/otel/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@fastify/otel/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@fastify/otel/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@fastify/proxy-addr": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", @@ -5816,7 +5899,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -6412,22 +6494,6 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/protobufjs": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-8.0.0.tgz", @@ -6495,7 +6561,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz", "integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -6960,22 +7025,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { "version": "0.64.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.64.0.tgz", @@ -7019,22 +7068,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-aws-sdk": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.59.0.tgz", @@ -7166,22 +7199,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-cassandra-driver": { "version": "0.57.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.57.0.tgz", @@ -7224,22 +7241,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-connect": { "version": "0.55.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.55.0.tgz", @@ -7284,22 +7285,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-connect/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-connect/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-cucumber": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.28.0.tgz", @@ -7342,22 +7327,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-dataloader": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.29.0.tgz", @@ -7399,22 +7368,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-dns": { "version": "0.55.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.55.0.tgz", @@ -7456,22 +7409,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-express": { "version": "0.60.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.60.0.tgz", @@ -7515,22 +7452,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-fastify": { "version": "0.57.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.57.0.tgz", @@ -7640,22 +7561,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-fs/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-fs/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-generic-pool": { "version": "0.55.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.55.0.tgz", @@ -7697,22 +7602,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-graphql": { "version": "0.60.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.60.0.tgz", @@ -7754,22 +7643,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-graphql/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-graphql/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-grpc": { "version": "0.212.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.212.0.tgz", @@ -7812,22 +7685,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-hapi": { "version": "0.58.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.58.0.tgz", @@ -7871,22 +7728,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-hapi/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-hapi/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-http": { "version": "0.213.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.213.0.tgz", @@ -8007,22 +7848,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-kafkajs": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.21.0.tgz", @@ -8065,22 +7890,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-knex": { "version": "0.53.1", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.53.1.tgz", @@ -8139,22 +7948,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-koa/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-koa/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-lru-memoizer": { "version": "0.56.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.56.0.tgz", @@ -8196,22 +7989,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-memcached": { "version": "0.55.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.55.0.tgz", @@ -8255,22 +8032,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-mongodb": { "version": "0.65.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.65.0.tgz", @@ -8313,22 +8074,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-mongoose": { "version": "0.58.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.58.0.tgz", @@ -8372,22 +8117,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-mysql": { "version": "0.58.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.58.0.tgz", @@ -8431,22 +8160,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-mysql/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-mysql2": { "version": "0.58.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.58.0.tgz", @@ -8490,22 +8203,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-nestjs-core": { "version": "0.58.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.58.0.tgz", @@ -8548,22 +8245,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-net": { "version": "0.56.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.56.0.tgz", @@ -8606,22 +8287,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-openai": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-openai/-/instrumentation-openai-0.10.0.tgz", @@ -8665,22 +8330,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-openai/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-openai/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-oracledb": { "version": "0.37.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-oracledb/-/instrumentation-oracledb-0.37.0.tgz", @@ -8724,22 +8373,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-oracledb/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-oracledb/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-pg": { "version": "0.64.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.64.0.tgz", @@ -8786,22 +8419,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-pino": { "version": "0.58.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.58.0.tgz", @@ -8845,22 +8462,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-redis": { "version": "0.60.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.60.0.tgz", @@ -8904,22 +8505,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-redis/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-restify": { "version": "0.57.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.57.0.tgz", @@ -8963,22 +8548,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-router": { "version": "0.56.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.56.0.tgz", @@ -9021,22 +8590,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-runtime-node": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-runtime-node/-/instrumentation-runtime-node-0.25.0.tgz", @@ -9078,22 +8631,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-runtime-node/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-runtime-node/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-socket.io": { "version": "0.59.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.59.0.tgz", @@ -9135,22 +8672,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-tedious": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.31.0.tgz", @@ -9194,22 +8715,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-tedious/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-tedious/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-undici": { "version": "0.22.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.22.0.tgz", @@ -9253,22 +8758,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-undici/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-undici/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/instrumentation-winston": { "version": "0.56.0", "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.56.0.tgz", @@ -9311,22 +8800,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "dependencies": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.213.0", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.213.0.tgz", @@ -12056,7 +11529,6 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -12690,7 +12162,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -14413,16 +13884,21 @@ ] }, "node_modules/import-in-the-middle": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.1.tgz", - "integrity": "sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" } }, + "node_modules/import-in-the-middle/node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -14775,7 +14251,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -15455,7 +14930,6 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } @@ -16436,7 +15910,6 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -18216,7 +17689,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18458,7 +17930,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -18893,7 +18364,6 @@ "version": "3.1003.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1003.0.tgz", "integrity": "sha512-on8GvIWeH1pD0l53NuKbPO84bEC1mk/9zskgU+dVKcVoGxOZI94fVddCJb+IwIUN6rfBHCfXPCVbgVyzsHTAVg==", - "peer": true, "requires": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", @@ -20442,7 +19912,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, - "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -21932,6 +21401,58 @@ "secure-json-parse": "^4.0.0" } }, + "@fastify/otel": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@fastify/otel/-/otel-0.17.1.tgz", + "integrity": "sha512-K4wyxfUZx2ux5o+b6BtTqouYFVILohLZmSbA2tKUueJstNcBnoGPVhllCaOvbQ3ZrXdUxUC/fyrSWSCqHhdOPg==", + "requires": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.212.0", + "@opentelemetry/semantic-conventions": "^1.28.0", + "minimatch": "^10.2.4" + }, + "dependencies": { + "@opentelemetry/api-logs": { + "version": "0.212.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.212.0.tgz", + "integrity": "sha512-TEEVrLbNROUkYY51sBJGk7lO/OLjuepch8+hmpM6ffMJQ2z/KVCjdHuCFX6fJj8OkJP2zckPjrJzQtXU3IAsFg==", + "requires": { + "@opentelemetry/api": "^1.3.0" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.212.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.212.0.tgz", + "integrity": "sha512-IyXmpNnifNouMOe0I/gX7ENfv2ZCNdYTF0FpCsoBcpbIHzk81Ww9rQTYTnvghszCg7qGrIhNvWC8dhEifgX9Jg==", + "requires": { + "@opentelemetry/api-logs": "0.212.0", + "import-in-the-middle": "^2.0.6", + "require-in-the-middle": "^8.0.0" + } + }, + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" + }, + "brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "requires": { + "balanced-match": "^4.0.2" + } + }, + "minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "requires": { + "brace-expansion": "^5.0.2" + } + } + } + }, "@fastify/proxy-addr": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", @@ -22437,8 +21958,7 @@ "@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "peer": true + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/api-logs": { "version": "0.208.0", @@ -22838,27 +22358,11 @@ "@opentelemetry/sdk-trace-node": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.5.1.tgz", - "integrity": "sha512-9lopQ6ZoElETOEN0csgmtEV5/9C7BMfA7VtF4Jape3i954b6sTY2k3Xw3CxUTKreDck/vpAuJM+EDo4zheUw+A==", - "requires": { - "@opentelemetry/context-async-hooks": "2.5.1", - "@opentelemetry/core": "2.5.1", - "@opentelemetry/sdk-trace-base": "2.5.1" - } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", + "integrity": "sha512-9lopQ6ZoElETOEN0csgmtEV5/9C7BMfA7VtF4Jape3i954b6sTY2k3Xw3CxUTKreDck/vpAuJM+EDo4zheUw+A==", "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" + "@opentelemetry/context-async-hooks": "2.5.1", + "@opentelemetry/core": "2.5.1", + "@opentelemetry/sdk-trace-base": "2.5.1" } }, "protobufjs": { @@ -22911,7 +22415,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz", "integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==", - "peer": true, "requires": { "@opentelemetry/semantic-conventions": "^1.29.0" } @@ -23226,22 +22729,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23272,22 +22759,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23382,22 +22853,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23427,22 +22882,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23474,22 +22913,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23519,22 +22942,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23563,22 +22970,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23607,22 +22998,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23653,22 +23028,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23744,22 +23103,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23788,22 +23131,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23832,22 +23159,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23877,22 +23188,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -23923,22 +23218,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24024,22 +23303,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24069,22 +23332,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24124,22 +23371,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24168,22 +23399,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24212,23 +23427,7 @@ "requires": { "@opentelemetry/api-logs": "0.212.0", "import-in-the-middle": "^2.0.6", - "require-in-the-middle": "^8.0.0" - } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" + "require-in-the-middle": "^8.0.0" } } } @@ -24259,22 +23458,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24305,22 +23488,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24351,22 +23518,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24397,22 +23548,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24442,22 +23577,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24487,22 +23606,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24533,22 +23636,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24579,22 +23666,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24628,22 +23699,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24674,22 +23729,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24720,22 +23759,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24766,22 +23789,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24811,22 +23818,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24855,22 +23846,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24899,22 +23874,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24945,22 +23904,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -24991,22 +23934,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -25036,22 +23963,6 @@ "import-in-the-middle": "^2.0.6", "require-in-the-middle": "^8.0.0" } - }, - "cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" - }, - "import-in-the-middle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", - "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", - "requires": { - "acorn": "^8.15.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^2.2.0", - "module-details-from-path": "^1.0.4" - } } } }, @@ -27136,8 +26047,7 @@ "acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "peer": true + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -27565,7 +26475,6 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, - "peer": true, "requires": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -28727,14 +27636,21 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "import-in-the-middle": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.1.tgz", - "integrity": "sha512-bruMpJ7xz+9jwGzrwEhWgvRrlKRYCRDBrfU+ur3FcasYXLJDxTruJ//8g2Noj+QFyRBeqbpj8Bhn4Fbw6HjvhA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", "requires": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "dependencies": { + "cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==" + } } }, "import-local": { @@ -28979,7 +27895,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "peer": true, "requires": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -29479,8 +28394,7 @@ "jsep": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", - "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", - "peer": true + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==" }, "jsesc": { "version": "3.1.0", @@ -30147,7 +29061,6 @@ "version": "8.16.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "peer": true, "requires": { "pg-cloudflare": "^1.2.7", "pg-connection-string": "^2.9.1", @@ -31372,8 +30285,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true + "dev": true }, "undici-types": { "version": "6.21.0", @@ -31538,7 +30450,6 @@ "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "peer": true, "requires": {} }, "xml2js": { diff --git a/package.json b/package.json index e81dea4a6..27519714c 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@aws-sdk/s3-request-presigner": "^3.979.0", "@fastify/accepts": "^5.0.4", "@fastify/multipart": "^9.4.0", + "@fastify/otel": "^0.17.1", "@fastify/rate-limit": "^10.3.0", "@fastify/swagger": "^9.7.0", "@fastify/swagger-ui": "^5.2.5", @@ -48,7 +49,6 @@ "@opentelemetry/exporter-prometheus": "^0.213.0", "@opentelemetry/host-metrics": "^0.38.3", "@opentelemetry/instrumentation-aws-sdk": "^0.59.0", - "@opentelemetry/instrumentation-fastify": "^0.57.0", "@opentelemetry/instrumentation-http": "^0.213.0", "@opentelemetry/instrumentation-knex": "^0.53.1", "@opentelemetry/instrumentation-pg": "^0.64.0", diff --git a/src/http/plugins/log-request.ts b/src/http/plugins/log-request.ts index a8b363989..ae7481a0b 100644 --- a/src/http/plugins/log-request.ts +++ b/src/http/plugins/log-request.ts @@ -1,5 +1,4 @@ import { logger, logSchema, redactQueryParamFromRequest } from '@internal/monitoring' -import { trace } from '@opentelemetry/api' import { FastifyReply } from 'fastify/types/reply' import { FastifyRequest } from 'fastify/types/request' import fastifyPlugin from 'fastify-plugin' @@ -77,8 +76,8 @@ export const logRequest = (options: RequestLoggerOptions) => req.resources = resources req.operation = req.routeOptions.config.operation - if (req.operation) { - trace.getActiveSpan()?.setAttribute('http.operation', req.operation.type) + if (req.operation && typeof req.opentelemetry === 'function') { + req.opentelemetry()?.span?.setAttribute('http.operation', req.operation.type) } }) @@ -135,7 +134,9 @@ function doRequestLog(req: FastifyRequest, options: LogRequestOptions) { if (reqMetadata) { try { - trace.getActiveSpan()?.setAttribute('http.metadata', JSON.stringify(reqMetadata)) + if (typeof req.opentelemetry === 'function') { + req.opentelemetry()?.span?.setAttribute('http.metadata', JSON.stringify(reqMetadata)) + } } catch (e) { // do nothing logSchema.warning(logger, 'Failed to serialize log metadata', { diff --git a/src/http/plugins/metrics.ts b/src/http/plugins/metrics.ts index d88fd2457..f46cae0e8 100644 --- a/src/http/plugins/metrics.ts +++ b/src/http/plugins/metrics.ts @@ -90,7 +90,6 @@ export const httpMetrics = (options: HttpMetricsOptions = {}) => const attributes = { method, - route, operation: request.operation?.type || 'unknown', status_code: statusCode, tenantId: request.tenantId || '', diff --git a/src/http/plugins/tracing.ts b/src/http/plugins/tracing.ts index eb4dcc1a7..e44b4c5bb 100644 --- a/src/http/plugins/tracing.ts +++ b/src/http/plugins/tracing.ts @@ -26,6 +26,19 @@ export const tracing = fastifyPlugin( } else { request.tracingMode = defaultTracingMode } + + // Use request.opentelemetry().span to get the root request span, + // not trace.getActiveSpan() which returns a child hook span. + const span = + typeof request.opentelemetry === 'function' ? request.opentelemetry()?.span : undefined + if (span) { + if (request.tenantId) { + span.setAttribute('tenant.ref', request.tenantId) + } + if (request.tracingMode) { + span.setAttribute('trace.mode', request.tracingMode) + } + } } catch (e) { logSchema.error(request.log, 'failed setting tracing mode', { error: e, type: 'tracing' }) } diff --git a/src/http/routes/s3/index.ts b/src/http/routes/s3/index.ts index 7a8ae38eb..43a004992 100644 --- a/src/http/routes/s3/index.ts +++ b/src/http/routes/s3/index.ts @@ -1,5 +1,4 @@ import fastifyMultipart from '@fastify/multipart' -import { trace } from '@opentelemetry/api' import { FastifyInstance, RouteHandlerMethod } from 'fastify' import { JSONSchema } from 'json-schema-to-ts' import { getConfig } from '../../../config' @@ -63,8 +62,8 @@ export default async function routes(fastify: FastifyInstance) { req.operation = { type: operation } - if (req.operation.type) { - trace.getActiveSpan()?.setAttribute('http.operation', req.operation.type) + if (req.operation.type && typeof req.opentelemetry === 'function') { + req.opentelemetry()?.span?.setAttribute('http.operation', req.operation.type) } const data: RequestInput = { diff --git a/src/http/routes/tus/lifecycle.ts b/src/http/routes/tus/lifecycle.ts index a66271162..6ab40b714 100644 --- a/src/http/routes/tus/lifecycle.ts +++ b/src/http/routes/tus/lifecycle.ts @@ -53,7 +53,6 @@ export async function onIncomingRequest(rawReq: Request, id: string) { } res.on('finish', () => { - console.log('Tus request finished') req.upload.db.dispose().catch((e) => { req.log.error({ error: e }, 'Error disposing db connection') }) diff --git a/src/internal/database/pool.ts b/src/internal/database/pool.ts index 67cd9e913..2518f9b76 100644 --- a/src/internal/database/pool.ts +++ b/src/internal/database/pool.ts @@ -1,7 +1,13 @@ import { wait } from '@internal/concurrency' import { getSslSettings } from '@internal/database/ssl' import { logger, logSchema } from '@internal/monitoring' -import { dbActiveConnection, dbActivePool, dbInUseConnection } from '@internal/monitoring/metrics' +import { + dbActiveConnection, + dbActivePool, + dbInUseConnection, + isMetricEnabled, + meter, +} from '@internal/monitoring/metrics' import TTLCache from '@isaacs/ttlcache' import { JWTPayload } from 'jose' import { Knex, knex } from 'knex' @@ -41,10 +47,16 @@ export interface User { payload: { role?: string } & JWTPayload } +export interface PoolStats { + used: number + total: number +} + export interface PoolStrategy { acquire(): Knex rebalance(options: { clusterSize: number }): void destroy(): Promise + getPoolStats(): PoolStats | null } export const searchPath = ['storage', 'public', 'extensions', ...dbSearchPath.split(',')].filter( @@ -72,22 +84,84 @@ const tenantPools = new TTLCache({ }, }) +// ============================================================================ +// Pool stats collection — chunked to avoid blocking the event loop +// ============================================================================ +interface PoolStatsSnapshot { + poolCount: number + totalConnections: number + totalInUse: number +} + +const STATS_CHUNK_SIZE = 100 +const STATS_INTERVAL_MS = 5_000 + +let cachedPoolStats: PoolStatsSnapshot = { + poolCount: 0, + totalConnections: 0, + totalInUse: 0, +} +let collectInProgress = false + +async function collectPoolStats() { + if (collectInProgress) return + collectInProgress = true + + try { + let poolCount = 0 + let totalConnections = 0 + let totalInUse = 0 + let chunkCount = 0 + + for (const [, pool] of tenantPools.entries()) { + poolCount++ + const stats = pool.getPoolStats() + if (stats) { + totalConnections += stats.total + totalInUse += stats.used + } + // Yield to the event loop between chunks + if (++chunkCount % STATS_CHUNK_SIZE === 0) { + await new Promise((resolve) => setImmediate(resolve)) + } + } + + cachedPoolStats = { + poolCount, + totalConnections, + totalInUse, + } + } finally { + collectInProgress = false + } +} + /** * PoolManager is a class that manages a pool of Knex connections. * It creates a new pool for each tenant and reuses existing pools. */ export class PoolManager { - monitor(signal: AbortSignal) { - const monitorInterval = setInterval(() => { - dbActivePool.record(tenantPools.size) - }, 2000) - - signal.addEventListener( - 'abort', - () => { - clearInterval(monitorInterval) + monitor() { + // Periodically collect stats in a non-blocking way + const interval = setInterval(() => { + void collectPoolStats() + }, STATS_INTERVAL_MS) + interval.unref() + + // Observable callback reads the cached snapshot — O(1) + meter.addBatchObservableCallback( + (observer) => { + if (isMetricEnabled('db_active_local_pools')) { + observer.observe(dbActivePool, cachedPoolStats.poolCount) + } + if (isMetricEnabled('db_connections')) { + observer.observe(dbActiveConnection, cachedPoolStats.totalConnections) + } + if (isMetricEnabled('db_connections_in_use')) { + observer.observe(dbInUseConnection, cachedPoolStats.totalInUse) + } }, - { once: true } + [dbActivePool, dbActiveConnection, dbInUseConnection] ) } @@ -152,7 +226,6 @@ export class PoolManager { */ class TenantPool implements PoolStrategy { protected pool?: Knex - protected monitorHandle?: ReturnType constructor(protected readonly options: TenantConnectionOptions) {} @@ -162,12 +235,10 @@ class TenantPool implements PoolStrategy { } this.pool = this.createKnexPool() - this.startMonitor() return this.pool } destroy(): Promise { - this.stopMonitor() const originalPool = this.pool if (!originalPool) { @@ -178,24 +249,12 @@ class TenantPool implements PoolStrategy { return this.drainPool(originalPool) } - protected startMonitor() { - this.monitorHandle = setInterval(() => { - const tarnPool = this.pool?.client?.pool - if (!tarnPool) return - - dbInUseConnection.record(tarnPool.numUsed(), { tenant_id: this.options.tenantId }) - dbActiveConnection.record(tarnPool.numUsed() + tarnPool.numFree(), { - tenant_id: this.options.tenantId, - }) - }, 2000) - - this.monitorHandle.unref() - } - - protected stopMonitor() { - if (this.monitorHandle) { - clearInterval(this.monitorHandle) - this.monitorHandle = undefined + getPoolStats(): PoolStats | null { + const tarnPool = this.pool?.client?.pool + if (!tarnPool) return null + return { + used: tarnPool.numUsed(), + total: tarnPool.numUsed() + tarnPool.numFree(), } } @@ -227,7 +286,6 @@ class TenantPool implements PoolStrategy { return } - this.stopMonitor() const originalPool = this.pool this.options.clusterSize = options.clusterSize diff --git a/src/internal/monitoring/logger.ts b/src/internal/monitoring/logger.ts index fb8163f93..51fbd1f5c 100644 --- a/src/internal/monitoring/logger.ts +++ b/src/internal/monitoring/logger.ts @@ -165,70 +165,74 @@ export function buildTransport(): pino.TransportMultiOptions { } } +const allowlistedHeaders = new Set([ + 'accept', + 'cf-connecting-ip', + 'cf-ipcountry', + 'host', + 'user-agent', + 'x-forwarded-proto', + 'x-forwarded-host', + 'x-forwarded-port', + 'x-forwarded-prefix', + 'referer', + 'content-length', + 'x-real-ip', + 'x-client-info', + 'x-forwarded-user-agent', + 'x-client-trace-id', + 'x-upsert', + 'content-type', + 'if-none-match', + 'if-modified-since', + 'upload-metadata', + 'upload-length', + 'upload-offset', + 'tus-resumable', + 'range', + 'cf-cache-status', + 'cf-ray', + 'location', + 'cache-control', + 'content-location', + 'content-range', + 'date', + 'transfer-encoding', + 'x-kong-proxy-latency', + 'x-kong-upstream-latency', + 'sb-gateway-mode', + 'sb-gateway-version', + 'x-transformations', + 'expires', + 'etag', + 'content-disposition', + 'last-modified', +]) + const whitelistHeaders = (headers: Record) => { const responseMetadata: Record = {} - const allowlistedRequestHeaders = [ - 'accept', - 'cf-connecting-ip', - 'cf-ipcountry', - 'host', - 'user-agent', - 'x-forwarded-proto', - 'x-forwarded-host', - 'x-forwarded-port', - 'x-forwarded-prefix', - 'referer', - 'content-length', - 'x-real-ip', - 'x-client-info', - 'x-forwarded-user-agent', - 'x-client-trace-id', - 'x-upsert', - 'content-type', - 'if-none-match', - 'if-modified-since', - 'upload-metadata', - 'upload-length', - 'upload-offset', - 'tus-resumable', - 'range', - ] - const allowlistedResponseHeaders = [ - 'cf-cache-status', - 'cf-ray', - 'location', - 'cache-control', - 'content-location', - 'content-range', - 'content-type', - 'content-length', - 'date', - 'transfer-encoding', - 'x-kong-proxy-latency', - 'x-kong-upstream-latency', - 'sb-gateway-mode', - 'sb-gateway-version', - 'x-transformations', - 'expires', - 'etag', - 'content-disposition', - 'last-modified', - ] - Object.keys(headers) - .filter( - (header) => - allowlistedRequestHeaders.includes(header) || allowlistedResponseHeaders.includes(header) - ) - .forEach((header) => { - responseMetadata[header.replace(/-/g, '_')] = `${headers[header]}` - }) + + for (const header in headers) { + if (allowlistedHeaders.has(header)) { + responseMetadata[header.replaceAll('-', '_')] = `${headers[header]}` + } + } return responseMetadata } export function redactQueryParamFromRequest(req: FastifyRequest, params: string[]) { - const lUrl = new URL(req.url, `${req.protocol}://${req.hostname}`) + const url = req.url + const qIdx = url.indexOf('?') + + // Fast path: no query string, nothing to redact + if (qIdx === -1) return url + + const query = url.slice(qIdx + 1) + // Fast path: no sensitive params present + if (!params.some((p) => query.includes(p))) return url + const lUrl = new URL(url, `${req.protocol}://${req.hostname}`) params.forEach((param) => { if (lUrl.searchParams.has(param)) { lUrl.searchParams.set(param, 'redacted') diff --git a/src/internal/monitoring/metrics.ts b/src/internal/monitoring/metrics.ts index 97e3b9319..12ecd72ab 100644 --- a/src/internal/monitoring/metrics.ts +++ b/src/internal/monitoring/metrics.ts @@ -1,16 +1,10 @@ -import { metrics } from '@opentelemetry/api' -import { - Counter, - Gauge, - Histogram, - UpDownCounter, -} from '@opentelemetry/api/build/src/metrics/Metric' +import { Attributes, metrics } from '@opentelemetry/api' import { getConfig } from '../../config' const { prometheusMetricsIncludeTenantId } = getConfig() // ============================================================================ -// Metric Registry — tracks all metrics and their enabled/disabled state +// Metric Registry — tracks all metrics for admin API // ============================================================================ export type MetricType = 'histogram' | 'counter' | 'gauge' | 'updowncounter' @@ -44,41 +38,68 @@ export function setMetricsEnabled(changes: { name: string; enabled: boolean }[]) } } -// Get meter from global API - instruments work once MeterProvider is registered -const meter = metrics.getMeter('storage-api') +/** Check if a metric is enabled (for observable gauges that emit via callbacks) */ +export function isMetricEnabled(name: string): boolean { + return metricsRegistry.get(name)?.enabled !== false +} + +// ============================================================================ +// Meter & registration +// ============================================================================ +export const meter = metrics.getMeter('storage-api') + +function stripTenantAttrs(attrs: Attributes): Attributes { + const { tenantId, tenant_id, ...rest } = attrs as Record + return rest as Attributes +} + +/** + * Registers a metric in the admin registry and wraps .record()/.add() + * to automatically strip tenant attributes when prometheusMetricsIncludeTenantId is false. + */ +export function registerMetric(name: string, type: MetricType, factory: () => T): T { + metricsRegistry.set(name, { name, type, enabled: !disabledMetrics.has(name) }) + const instrument = factory() + + if (prometheusMetricsIncludeTenantId) return instrument + + // biome-ignore lint/suspicious/noExplicitAny: wrapping OTel instrument methods + const inst = instrument as any + if (typeof inst.record === 'function') { + const original = inst.record.bind(inst) + inst.record = (value: number, attrs?: Attributes) => + original(value, attrs ? stripTenantAttrs(attrs) : attrs) + } + if (typeof inst.add === 'function') { + const original = inst.add.bind(inst) + inst.add = (value: number, attrs?: Attributes) => + original(value, attrs ? stripTenantAttrs(attrs) : attrs) + } + + return instrument +} // ============================================================================ // HTTP Request Metrics // ============================================================================ -export const httpRequestDuration = withMetricLabels( +export const httpRequestDuration = registerMetric( 'http_request_duration_seconds', 'histogram', - meter.createHistogram('http_request_duration_seconds', { - description: 'HTTP request duration in seconds', - unit: 's', - }) + () => + meter.createHistogram('http_request_duration_seconds', { + description: 'HTTP request duration in seconds', + unit: 's', + }) ) -export const httpRequestsTotal = withMetricLabels( - 'http_requests_total', - 'counter', - meter.createCounter('http_requests_total', { - description: 'Total number of HTTP requests', - }) -) - -export const httpRequestSizeBytes = withMetricLabels( - 'http_request_size_bytes', - 'counter', +export const httpRequestSizeBytes = registerMetric('http_request_size_bytes', 'counter', () => meter.createCounter('http_request_size_bytes', { description: 'Total bytes received in HTTP requests (from content-length header)', unit: 'bytes', }) ) -export const httpResponseSizeBytes = withMetricLabels( - 'http_response_size_bytes', - 'counter', +export const httpResponseSizeBytes = registerMetric('http_response_size_bytes', 'counter', () => meter.createCounter('http_response_size_bytes', { description: 'Total bytes sent in HTTP responses (from content-length header)', unit: 'bytes', @@ -88,17 +109,13 @@ export const httpResponseSizeBytes = withMetricLabels( // ============================================================================ // Upload Metrics // ============================================================================ -export const fileUploadStarted = withMetricLabels( - 'upload_started', - 'counter', +export const fileUploadStarted = registerMetric('upload_started', 'counter', () => meter.createCounter('upload_started', { description: 'Total uploads started', }) ) -export const fileUploadedSuccess = withMetricLabels( - 'upload_success', - 'counter', +export const fileUploadedSuccess = registerMetric('upload_success', 'counter', () => meter.createCounter('upload_success', { description: 'Total successful uploads', }) @@ -107,87 +124,58 @@ export const fileUploadedSuccess = withMetricLabels( // ============================================================================ // Database Metrics // ============================================================================ -export const dbQueryPerformance = withMetricLabels( +export const dbQueryPerformance = registerMetric( 'database_query_performance_seconds', 'histogram', - meter.createHistogram('database_query_performance_seconds', { - description: 'Database query performance in seconds', - unit: 's', - }) + () => + meter.createHistogram('database_query_performance_seconds', { + description: 'Database query performance in seconds', + unit: 's', + }) ) -export const dbActivePool = withMetricLabels( - 'db_active_local_pools', - 'gauge', - meter.createGauge('db_active_local_pools', { - description: 'Number of database pools created', - }) -) - -export const dbActiveConnection = withMetricLabels( - 'db_connections', - 'gauge', - meter.createGauge('db_connections', { - description: 'Number of database connections in the pool', - }) -) - -export const dbInUseConnection = withMetricLabels( - 'db_connections_in_use', - 'gauge', - meter.createGauge('db_connections_in_use', { - description: 'Number of database connections currently in use', - }) -) - -export const dbConnectionAcquireTime = withMetricLabels( +export const dbConnectionAcquireTime = registerMetric( 'db_connection_acquire_seconds', 'histogram', - meter.createHistogram('db_connection_acquire_seconds', { - description: 'Time taken to acquire a database connection from the pool in seconds', - unit: 's', - }) + () => + meter.createHistogram('db_connection_acquire_seconds', { + description: 'Time taken to acquire a database connection from the pool in seconds', + unit: 's', + }) ) // ============================================================================ // Queue Metrics // ============================================================================ -export const queueJobSchedulingTime = withMetricLabels( +export const queueJobSchedulingTime = registerMetric( 'queue_job_scheduled_time_seconds', 'histogram', - meter.createHistogram('queue_job_scheduled_time_seconds', { - description: 'Time taken to schedule a job in the queue in seconds', - unit: 's', - }) + () => + meter.createHistogram('queue_job_scheduled_time_seconds', { + description: 'Time taken to schedule a job in the queue in seconds', + unit: 's', + }) ) -export const queueJobScheduled = withMetricLabels( - 'queue_job_scheduled', - 'updowncounter', +export const queueJobScheduled = registerMetric('queue_job_scheduled', 'updowncounter', () => meter.createUpDownCounter('queue_job_scheduled', { description: 'Current number of pending messages in the queue', }) ) -export const queueJobCompleted = withMetricLabels( - 'queue_job_completed', - 'updowncounter', +export const queueJobCompleted = registerMetric('queue_job_completed', 'updowncounter', () => meter.createUpDownCounter('queue_job_completed', { description: 'Current number of processed messages in the queue', }) ) -export const queueJobRetryFailed = withMetricLabels( - 'queue_job_retry_failed', - 'updowncounter', +export const queueJobRetryFailed = registerMetric('queue_job_retry_failed', 'updowncounter', () => meter.createUpDownCounter('queue_job_retry_failed', { description: 'Current number of failed attempts messages in the queue', }) ) -export const queueJobError = withMetricLabels( - 'queue_job_error', - 'updowncounter', +export const queueJobError = registerMetric('queue_job_error', 'updowncounter', () => meter.createUpDownCounter('queue_job_error', { description: 'Current number of errored messages in the queue', }) @@ -196,9 +184,7 @@ export const queueJobError = withMetricLabels( // ============================================================================ // S3 Metrics // ============================================================================ -export const s3UploadPart = withMetricLabels( - 's3_upload_part_seconds', - 'histogram', +export const s3UploadPart = registerMetric('s3_upload_part_seconds', 'histogram', () => meter.createHistogram('s3_upload_part_seconds', { description: 'S3 upload part performance in seconds', unit: 's', @@ -208,83 +194,47 @@ export const s3UploadPart = withMetricLabels( // ============================================================================ // HTTP Pool Metrics // ============================================================================ -export const httpPoolBusySockets = withMetricLabels( - 'http_pool_busy_sockets', - 'gauge', +export const httpPoolBusySockets = registerMetric('http_pool_busy_sockets', 'gauge', () => meter.createGauge('http_pool_busy_sockets', { description: 'Number of busy sockets currently in use', }) ) -export const httpPoolFreeSockets = withMetricLabels( - 'http_pool_free_sockets', - 'gauge', +export const httpPoolFreeSockets = registerMetric('http_pool_free_sockets', 'gauge', () => meter.createGauge('http_pool_free_sockets', { description: 'Number of free sockets available for reuse', }) ) -export const httpPoolPendingRequests = withMetricLabels( - 'http_pool_requests', - 'gauge', +export const httpPoolPendingRequests = registerMetric('http_pool_requests', 'gauge', () => meter.createGauge('http_pool_requests', { description: 'Number of pending requests waiting for a socket', }) ) -export const httpPoolErrors = withMetricLabels( - 'http_pool_errors', - 'gauge', +export const httpPoolErrors = registerMetric('http_pool_errors', 'gauge', () => meter.createGauge('http_pool_errors', { description: 'Number of socket errors', }) ) // ============================================================================ -// Metric wrapper — registers in registry, adds enabled guard + tenant label stripping +// Database Pool Metrics (observable — collected only at export time) // ============================================================================ -function stripTenantLabels(labels?: Record): Record | undefined { - if (!labels) return labels - const { tenant_id, tenantId, ...rest } = labels - return rest -} - -function withMetricLabels( - name: string, - type: MetricType, - metricType: T -): T { - const entry: MetricRegistryEntry = { - name, - type, - enabled: !disabledMetrics.has(name), - } - metricsRegistry.set(name, entry) - - if ('record' in metricType) { - const originalRecord = metricType.record.bind(metricType) - metricType.record = (value: number, labels?: Record) => { - if (!entry.enabled) return - return originalRecord( - value, - prometheusMetricsIncludeTenantId ? labels : stripTenantLabels(labels) - ) - } - return metricType - } - - if ('add' in metricType) { - const originalAdd = metricType.add.bind(metricType) - metricType.add = (value: number, labels?: Record) => { - if (!entry.enabled) return - return originalAdd( - value, - prometheusMetricsIncludeTenantId ? labels : stripTenantLabels(labels) - ) - } +export const dbActivePool = registerMetric('db_active_local_pools', 'gauge', () => + meter.createObservableGauge('db_active_local_pools', { + description: 'Number of database pools created', + }) +) - return metricType - } +export const dbActiveConnection = registerMetric('db_connections', 'gauge', () => + meter.createObservableGauge('db_connections', { + description: 'Number of database connections in the pool', + }) +) - return metricType -} +export const dbInUseConnection = registerMetric('db_connections_in_use', 'gauge', () => + meter.createObservableGauge('db_connections_in_use', { + description: 'Number of database connections currently in use', + }) +) diff --git a/src/internal/monitoring/otel-metrics.ts b/src/internal/monitoring/otel-metrics.ts index 1c8ee4ad7..3cfb91c3a 100644 --- a/src/internal/monitoring/otel-metrics.ts +++ b/src/internal/monitoring/otel-metrics.ts @@ -26,17 +26,101 @@ const { version, otelMetricsExportIntervalMs, otelMetricsEnabled, otelMetricsTem let prometheusExporter: PrometheusExporter | undefined let meterProvider: MeterProvider | undefined let metricsShutdownPromise: Promise | undefined -let runtimeNodeInstrumentation: RuntimeNodeInstrumentation | undefined -let storageNodeInstrumentation: StorageNodeInstrumentation | undefined interface OTelMetricsGlobalState { __otelMetricsShutdown?: () => Promise } -/** - * Explicit shutdown hook for test and process teardown. - * Safe to call multiple times. - */ +// ============================================================================= +// Shared config +// ============================================================================= +const instance = os.hostname() +const headersEnv = process.env.OTEL_EXPORTER_OTLP_METRICS_HEADERS || '' +const otlpEndpoint = + process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_ENDPOINT + +const exporterHeaders = headersEnv + .split(',') + .filter(Boolean) + .reduce( + (all, header) => { + const [name, value] = header.split('=') + all[name] = value + return all + }, + {} as Record + ) + +const grpcMetadata = new grpc.Metadata() +Object.keys(exporterHeaders).forEach((key) => { + grpcMetadata.set(key, exporterHeaders[key]) +}) + +const resource = resourceFromAttributes({ + [ATTR_SERVICE_NAME]: 'storage_api', + [ATTR_SERVICE_VERSION]: version, + 'metric.version': '1', + region, + instance, +}) + +// Bucket boundaries for duration histograms (in seconds) +const durationBuckets = [ + 0.0005, 0.001, 0.0025, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, +] + +const histogramAggregation = { + type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM, + options: { boundaries: durationBuckets }, +} as const + +const dropAggregation = { type: AggregationType.DROP } as const + +// Views — custom histogram buckets + drop auto-instrumentation duplicates. +// Tenant attribute stripping is handled by registerMetric() in metrics.ts. +const views = [ + { + meterName: 'storage-api', + instrumentName: 'http_request_duration_seconds', + aggregation: histogramAggregation, + }, + { + meterName: 'storage-api', + instrumentName: 'database_query_performance_seconds', + aggregation: histogramAggregation, + }, + { + meterName: 'storage-api', + instrumentName: 'db_connection_acquire_seconds', + aggregation: histogramAggregation, + }, + { + meterName: 'storage-api', + instrumentName: 'queue_job_scheduled_time_seconds', + aggregation: histogramAggregation, + }, + { + meterName: 'storage-api', + instrumentName: 's3_upload_part_seconds', + aggregation: histogramAggregation, + }, + // Drop duplicate HTTP metrics from auto-instrumentations — we have our own in metrics.ts + { + meterName: '@opentelemetry/instrumentation-http', + instrumentName: '*', + aggregation: dropAggregation, + }, + // Drop any Fastify metrics from auto-instrumentations (now using @fastify/otel for traces only) + { + meterName: '@fastify/otel', + instrumentName: '*', + aggregation: dropAggregation, + }, +] + +// ============================================================================= +// Shutdown +// ============================================================================= export async function shutdownOtelMetrics(): Promise { if (metricsShutdownPromise) { await metricsShutdownPromise @@ -54,10 +138,6 @@ export async function shutdownOtelMetrics(): Promise { }) try { - // Disable custom/system instrumentations first to clear background timers - storageNodeInstrumentation?.disable() - runtimeNodeInstrumentation?.disable() - await provider.shutdown() logSchema.info(logger, '[OTel Metrics] Shutdown complete', { type: 'otel-metrics', @@ -72,8 +152,6 @@ export async function shutdownOtelMetrics(): Promise { meterProvider = undefined } prometheusExporter = undefined - runtimeNodeInstrumentation = undefined - storageNodeInstrumentation = undefined } })() @@ -83,9 +161,9 @@ export async function shutdownOtelMetrics(): Promise { ;(globalThis as typeof globalThis & OTelMetricsGlobalState).__otelMetricsShutdown = shutdownOtelMetrics -/** - * Handles the /metrics endpoint request using OTel Prometheus exporter - */ +// ============================================================================= +// /metrics endpoint handler +// ============================================================================= export async function handleMetricsRequest( request: FastifyRequest, reply: FastifyReply @@ -104,44 +182,12 @@ export async function handleMetricsRequest( return Promise.resolve() } +// ============================================================================= +// Initialize at import time +// ============================================================================= if (otelMetricsEnabled) { - const headersEnv = process.env.OTEL_EXPORTER_OTLP_METRICS_HEADERS || '' - const otlpEndpoint = - process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT || process.env.OTEL_EXPORTER_OTLP_ENDPOINT - - const exporterHeaders = headersEnv - .split(',') - .filter(Boolean) - .reduce( - (all, header) => { - const [name, value] = header.split('=') - all[name] = value - return all - }, - {} as Record - ) - - const grpcMetadata = new grpc.Metadata() - Object.keys(exporterHeaders).forEach((key) => { - grpcMetadata.set(key, exporterHeaders[key]) - }) - - // ============================================================================= - // Initialize MeterProvider at import time (before other modules use metrics) - // ============================================================================= - const instance = os.hostname() - - const resource = resourceFromAttributes({ - [ATTR_SERVICE_NAME]: 'storage_api', - [ATTR_SERVICE_VERSION]: version, - 'metric.version': '1', - region, - instance, - }) - const readers = [] - // Add OTLP exporter if endpoint is configured (for pushing to collector) if (otlpEndpoint) { const otlpExporter = new OTLPMetricExporter({ url: otlpEndpoint, @@ -162,55 +208,17 @@ if (otelMetricsEnabled) { ) } - // Always add Prometheus exporter for /metrics endpoint prometheusExporter = new PrometheusExporter({ prefix: 'storage_api', - preventServerStart: true, // We'll handle the endpoint in Fastify + preventServerStart: true, withResourceConstantLabels: /^(region|instance|metric\.version)$/, }) readers.push(prometheusExporter) - // Bucket boundaries for duration histograms (in seconds) - // Provides good resolution from 0.5ms to 10s - const durationBuckets = [ - 0.0005, 0.001, 0.0025, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, - ] - - const histogramAggregation = { - type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM, - options: { boundaries: durationBuckets }, - } as const - meterProvider = new MeterProvider({ resource, readers, - views: [ - { - meterName: 'storage-api', - instrumentName: 'http_request_duration_seconds', - aggregation: histogramAggregation, - }, - { - meterName: 'storage-api', - instrumentName: 'database_query_performance_seconds', - aggregation: histogramAggregation, - }, - { - meterName: 'storage-api', - instrumentName: 'queue_job_scheduled_time_seconds', - aggregation: histogramAggregation, - }, - { - meterName: 'storage-api', - instrumentName: 's3_upload_part_seconds', - aggregation: histogramAggregation, - }, - { - meterName: 'storage-api', - instrumentName: 'db_connection_acquire_seconds', - aggregation: histogramAggregation, - }, - ], + views, }) // Register as global provider IMMEDIATELY so metrics.ts instruments work @@ -231,29 +239,20 @@ if (otelMetricsEnabled) { const hostMetrics = new HostMetrics({ meterProvider, name: 'storage-api-host-metrics', - metricGroups: ['system.cpu', 'system.memory', 'process.cpu', 'process.memory'], + metricGroups: ['process.cpu', 'process.memory'], }) hostMetrics.start() // Register Node.js runtime instrumentations - runtimeNodeInstrumentation = new RuntimeNodeInstrumentation() - storageNodeInstrumentation = new StorageNodeInstrumentation({ - labels: { region, instance }, - }) - registerInstrumentations({ meterProvider, instrumentations: [ - // Official OTel: event loop delay/time/utilization, GC, heap spaces - runtimeNodeInstrumentation, - // Custom: event loop lag, CPU, handles, process start time, external memory, file descriptors - storageNodeInstrumentation, + new RuntimeNodeInstrumentation(), + new StorageNodeInstrumentation({ labels: { region, instance } }), ], }) - logSchema.info(logger, '[OTel Metrics] Initialized successfully', { - type: 'otel-metrics', - }) + logSchema.info(logger, '[OTel Metrics] Initialized', { type: 'otel-metrics' }) // Graceful shutdown const shutdown = () => { diff --git a/src/internal/monitoring/otel-tracing.ts b/src/internal/monitoring/otel-tracing.ts index 0480725de..0915764db 100644 --- a/src/internal/monitoring/otel-tracing.ts +++ b/src/internal/monitoring/otel-tracing.ts @@ -10,6 +10,7 @@ const { storageS3InternalTracesEnabled, } = getConfig() +import { FastifyOtelInstrumentation } from '@fastify/otel' import * as grpc from '@grpc/grpc-js' import { logger, logSchema } from '@internal/monitoring/logger' import { TenantSpanProcessor } from '@internal/monitoring/otel-instrumentation' @@ -72,6 +73,8 @@ if (tracingEnabled && traceExporter) { } if (tracingEnabled && traceExporter && spanProcessors.length > 0) { + const ignoreRoutes = ['/metrics', '/status', '/health', '/healthcheck'] + // Configure the OpenTelemetry Node SDK const sdk = new NodeSDK({ resource: resourceFromAttributes({ @@ -81,11 +84,21 @@ if (tracingEnabled && traceExporter && spanProcessors.length > 0) { spanProcessors, traceExporter, instrumentations: [ + // @fastify/otel replaces @opentelemetry/instrumentation-fastify + // It auto-sets http.route, http.request.method, url.path on spans. + // Other attributes (tenant.ref, trace.mode, http.operation) are set + // in Fastify hooks via request.opentelemetry().span. + new FastifyOtelInstrumentation({ + enabled: true, + registerOnInitialization: true, + ignorePaths: (routeOpts) => { + return ignoreRoutes.includes(routeOpts.url) + }, + }), getNodeAutoInstrumentations({ '@opentelemetry/instrumentation-http': { enabled: true, ignoreIncomingRequestHook: (req) => { - const ignoreRoutes = ['/metrics', '/status', '/health', '/healthcheck'] return ignoreRoutes.some((url) => req.url?.includes(url)) ?? false }, ignoreOutgoingRequestHook: (req) => { @@ -133,16 +146,6 @@ if (tracingEnabled && traceExporter && spanProcessors.length > 0) { enabled: true, requireParentSpan: true, }, - '@opentelemetry/instrumentation-fastify': { - enabled: true, - requestHook: (span, req) => { - span.setAttribute('http.method', req.request.method) - span.setAttribute('http.route', req.request.routerPath) - span.setAttribute('tenant.ref', req.request.tenantId) - span.setAttribute('http.operation', req.request.operation) - span.setAttribute('trace.mode', req.request.tracingMode) - }, - }, '@opentelemetry/instrumentation-knex': { enabled: true, }, diff --git a/src/start/server.ts b/src/start/server.ts index 409f1fa0f..130d3eb7f 100644 --- a/src/start/server.ts +++ b/src/start/server.ts @@ -121,7 +121,7 @@ async function main() { } // PoolManager Monitoring - TenantConnection.poolManager.monitor(shutdownSignal.nextGroup.signal) + TenantConnection.poolManager.monitor() // Cluster information await Cluster.init(shutdownSignal.nextGroup.signal)