Files
immich/docker/signoz-immich-dashboard.json
T
midzelis e03ed9b387 feat(server): add OpenTelemetry tracing and metrics support
Adds comprehensive OpenTelemetry instrumentation for better observability:

Tracing:
- HTTP requests via @opentelemetry/instrumentation-http
- NestJS controllers via @opentelemetry/instrumentation-nestjs-core
- Redis operations via @opentelemetry/instrumentation-ioredis
- BullMQ job queues via bullmq-otel
- Database queries via Kysely log callback with accurate timing
- File operations (send, stream, read)
- Media processing (thumbnails, thumbhash, EXIF operations)
- Metadata extraction

Metrics:
- Database connection pool usage (used/idle connections)

The SDK is initialized in telemetry-preload.ts which is preloaded via
--require before the main app starts. This ensures http instrumentation
hooks are in place before any http module is imported.

Enable tracing by setting OTEL_EXPORTER_OTLP_ENDPOINT environment variable.

Also adds TraceContext to IBaseJob for future distributed trace propagation
across BullMQ job boundaries.
2026-01-28 05:14:44 +00:00

1876 lines
58 KiB
JSON

{
"description": "Comprehensive monitoring dashboard for Immich photo sharing server with OpenTelemetry instrumentation",
"layout": [
{"h": 1, "i": "row-overview", "maxH": 1, "minH": 1, "minW": 12, "moved": false, "static": false, "w": 12, "x": 0, "y": 0},
{"h": 6, "i": "http-latency-p99", "moved": false, "static": false, "w": 4, "x": 0, "y": 1},
{"h": 6, "i": "http-throughput", "moved": false, "static": false, "w": 4, "x": 4, "y": 1},
{"h": 6, "i": "http-error-rate", "moved": false, "static": false, "w": 4, "x": 8, "y": 1},
{"h": 6, "i": "http-status-codes", "moved": false, "static": false, "w": 6, "x": 0, "y": 7},
{"h": 6, "i": "top-endpoints", "moved": false, "static": false, "w": 6, "x": 6, "y": 7},
{"h": 1, "i": "row-database", "maxH": 1, "minH": 1, "minW": 12, "moved": false, "static": false, "w": 12, "x": 0, "y": 13},
{"h": 6, "i": "db-query-latency", "moved": false, "static": false, "w": 6, "x": 0, "y": 14},
{"h": 6, "i": "db-operations", "moved": false, "static": false, "w": 6, "x": 6, "y": 14},
{"h": 6, "i": "db-connections", "moved": false, "static": false, "w": 6, "x": 0, "y": 20},
{"h": 6, "i": "db-slow-queries", "moved": false, "static": false, "w": 6, "x": 6, "y": 20},
{"h": 1, "i": "row-jobs", "maxH": 1, "minH": 1, "minW": 12, "moved": false, "static": false, "w": 12, "x": 0, "y": 26},
{"h": 6, "i": "job-throughput", "moved": false, "static": false, "w": 6, "x": 0, "y": 27},
{"h": 6, "i": "job-latency", "moved": false, "static": false, "w": 6, "x": 6, "y": 27},
{"h": 1, "i": "row-redis", "maxH": 1, "minH": 1, "minW": 12, "moved": false, "static": false, "w": 12, "x": 0, "y": 33},
{"h": 6, "i": "redis-operations", "moved": false, "static": false, "w": 6, "x": 0, "y": 34},
{"h": 6, "i": "redis-latency", "moved": false, "static": false, "w": 6, "x": 6, "y": 34}
],
"panelMap": {
"row-overview": {
"collapsed": false,
"widgets": [
{"h": 6, "i": "http-latency-p99", "moved": false, "static": false, "w": 4, "x": 0, "y": 1},
{"h": 6, "i": "http-throughput", "moved": false, "static": false, "w": 4, "x": 4, "y": 1},
{"h": 6, "i": "http-error-rate", "moved": false, "static": false, "w": 4, "x": 8, "y": 1},
{"h": 6, "i": "http-status-codes", "moved": false, "static": false, "w": 6, "x": 0, "y": 7},
{"h": 6, "i": "top-endpoints", "moved": false, "static": false, "w": 6, "x": 6, "y": 7}
]
},
"row-database": {
"collapsed": false,
"widgets": [
{"h": 6, "i": "db-query-latency", "moved": false, "static": false, "w": 6, "x": 0, "y": 14},
{"h": 6, "i": "db-operations", "moved": false, "static": false, "w": 6, "x": 6, "y": 14},
{"h": 6, "i": "db-connections", "moved": false, "static": false, "w": 6, "x": 0, "y": 20},
{"h": 6, "i": "db-slow-queries", "moved": false, "static": false, "w": 6, "x": 6, "y": 20}
]
},
"row-jobs": {
"collapsed": false,
"widgets": [
{"h": 6, "i": "job-throughput", "moved": false, "static": false, "w": 6, "x": 0, "y": 27},
{"h": 6, "i": "job-latency", "moved": false, "static": false, "w": 6, "x": 6, "y": 27}
]
},
"row-redis": {
"collapsed": false,
"widgets": [
{"h": 6, "i": "redis-operations", "moved": false, "static": false, "w": 6, "x": 0, "y": 34},
{"h": 6, "i": "redis-latency", "moved": false, "static": false, "w": 6, "x": 6, "y": 34}
]
}
},
"tags": ["immich", "photo-sharing", "apm", "database", "redis", "jobs"],
"title": "Immich Photo Server",
"uploadedGrafana": false,
"variables": {},
"version": "v4",
"widgets": [
{
"description": "",
"id": "row-overview",
"panelTypes": "row",
"title": "HTTP API Overview"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "P99 latency of HTTP requests to the Immich API",
"fillSpans": false,
"id": "http-latency-p99",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p99",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [],
"having": [],
"legend": "p99",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "p99",
"stepInterval": 60,
"timeAggregation": "p99"
},
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p90",
"dataSource": "traces",
"disabled": false,
"expression": "B",
"filters": {
"items": [
{
"id": "filter-service-b",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind-b",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [],
"having": [],
"legend": "p90",
"limit": null,
"orderBy": [],
"queryName": "B",
"reduceTo": "avg",
"spaceAggregation": "p90",
"stepInterval": 60,
"timeAggregation": "p90"
},
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p50",
"dataSource": "traces",
"disabled": false,
"expression": "C",
"filters": {
"items": [
{
"id": "filter-service-c",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind-c",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [],
"having": [],
"legend": "p50",
"limit": null,
"orderBy": [],
"queryName": "C",
"reduceTo": "avg",
"spaceAggregation": "p50",
"stepInterval": 60,
"timeAggregation": "p50"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "A/1000000",
"legend": "p99 (ms)",
"queryName": "F1"
},
{
"disabled": false,
"expression": "B/1000000",
"legend": "p90 (ms)",
"queryName": "F2"
},
{
"disabled": false,
"expression": "C/1000000",
"legend": "p50 (ms)",
"queryName": "F3"
}
]
},
"clickhouse_sql": [],
"id": "http-latency-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "API Latency",
"yAxisUnit": "ms"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "HTTP requests per second to the Immich API",
"fillSpans": false,
"id": "http-throughput",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [],
"having": [],
"legend": "Requests/sec",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": []
},
"clickhouse_sql": [],
"id": "http-throughput-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Request Throughput",
"yAxisUnit": "reqps"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Percentage of HTTP requests resulting in errors",
"fillSpans": false,
"id": "http-error-rate",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
},
{
"id": "filter-error",
"key": {
"dataType": "bool",
"id": "hasError--bool----true",
"isColumn": true,
"isJSON": false,
"key": "hasError",
"type": ""
},
"op": "=",
"value": "true"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [],
"having": [],
"legend": "Errors",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
},
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "B",
"filters": {
"items": [
{
"id": "filter-service-b",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind-b",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [],
"having": [],
"legend": "Total",
"limit": null,
"orderBy": [],
"queryName": "B",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "A/B*100",
"legend": "Error Rate %",
"queryName": "F1"
}
]
},
"clickhouse_sql": [],
"id": "http-error-rate-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [
{"color": "#f5222d", "index": 0, "value": 5}
],
"timePreferance": "GLOBAL_TIME",
"title": "Error Rate",
"yAxisUnit": "percent"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Distribution of HTTP response status codes",
"fillSpans": true,
"id": "http-status-codes",
"isStacked": true,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "0.7",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "int64",
"id": "http.status_code--int64--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.status_code",
"type": "tag"
}
],
"having": [],
"legend": "{{http.status_code}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": []
},
"clickhouse_sql": [],
"id": "http-status-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "HTTP Status Codes",
"yAxisUnit": "reqps"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Top API endpoints by request count and average latency",
"fillSpans": false,
"id": "top-endpoints",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "table",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
},
{
"id": "filter-target",
"key": {
"dataType": "string",
"id": "http.target--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.target",
"type": "tag"
},
"op": "exists",
"value": ""
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "http.target--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.target",
"type": "tag"
},
{
"dataType": "string",
"id": "http.method--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.method",
"type": "tag"
}
],
"having": [],
"legend": "",
"limit": 20,
"orderBy": [{"columnName": "A", "order": "desc"}],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "count"
},
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "avg",
"dataSource": "traces",
"disabled": false,
"expression": "B",
"filters": {
"items": [
{
"id": "filter-service-b",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-kind-b",
"key": {
"dataType": "int64",
"id": "kind--int64----true",
"isColumn": true,
"isJSON": false,
"key": "kind",
"type": ""
},
"op": "=",
"value": "2"
},
{
"id": "filter-target-b",
"key": {
"dataType": "string",
"id": "http.target--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.target",
"type": "tag"
},
"op": "exists",
"value": ""
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "http.target--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.target",
"type": "tag"
},
{
"dataType": "string",
"id": "http.method--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.method",
"type": "tag"
}
],
"having": [],
"legend": "",
"limit": 20,
"orderBy": [],
"queryName": "B",
"reduceTo": "avg",
"spaceAggregation": "avg",
"stepInterval": 60,
"timeAggregation": "avg"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "B/1000000",
"legend": "Avg Latency (ms)",
"queryName": "F1"
}
]
},
"clickhouse_sql": [],
"id": "top-endpoints-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [
{
"dataType": "string",
"id": "serviceName--string--resource--false",
"isColumn": false,
"isJSON": false,
"key": "serviceName",
"type": "resource"
},
{
"dataType": "string",
"id": "body--string--body--true",
"isColumn": true,
"isJSON": false,
"key": "body",
"type": "body"
},
{
"dataType": "string",
"id": "severity_text--string----true",
"isColumn": true,
"isJSON": false,
"key": "severity_text",
"type": ""
}
],
"selectedTracesFields": [
{
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
{
"dataType": "string",
"id": "http.target--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.target",
"type": "tag"
},
{
"dataType": "string",
"id": "http.method--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "http.method",
"type": "tag"
}
],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Top API Endpoints",
"yAxisUnit": "short"
},
{
"description": "",
"id": "row-database",
"panelTypes": "row",
"title": "Database (PostgreSQL)"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Database query latency by operation type (SELECT, INSERT, UPDATE, DELETE)",
"fillSpans": false,
"id": "db-query-latency",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p95",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-db",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "postgresql"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "db.operation.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.operation.name",
"type": "tag"
}
],
"having": [],
"legend": "{{db.operation.name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "p95",
"stepInterval": 60,
"timeAggregation": "p95"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "A/1000000",
"legend": "{{db.operation.name}} P95",
"queryName": "F1"
}
]
},
"clickhouse_sql": [],
"id": "db-latency-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "DB Query Latency (P95)",
"yAxisUnit": "ms"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Database operations per second by type",
"fillSpans": true,
"id": "db-operations",
"isStacked": true,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "0.7",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-db",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "postgresql"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "db.operation.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.operation.name",
"type": "tag"
}
],
"having": [],
"legend": "{{db.operation.name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": []
},
"clickhouse_sql": [],
"id": "db-ops-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "DB Operations/sec",
"yAxisUnit": "ops"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Database query distribution by table",
"fillSpans": true,
"id": "db-connections",
"isStacked": true,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "0.7",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-db",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "postgresql"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "db.collection.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.collection.name",
"type": "tag"
}
],
"having": [],
"legend": "{{db.collection.name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": []
},
"clickhouse_sql": [],
"id": "db-connections-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "DB Queries by Table",
"yAxisUnit": "ops"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {"F1": "ms"},
"description": "Slowest database queries by table",
"fillSpans": false,
"id": "db-slow-queries",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "table",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p99",
"dataSource": "traces",
"disabled": true,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-db",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "postgresql"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "db.collection.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.collection.name",
"type": "tag"
},
{
"dataType": "string",
"id": "db.operation.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.operation.name",
"type": "tag"
}
],
"having": [],
"legend": "",
"limit": 15,
"orderBy": [{"columnName": "F1", "order": "desc"}],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "p99",
"stepInterval": 60,
"timeAggregation": "p99"
},
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "B",
"filters": {
"items": [
{
"id": "filter-service-b",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-db-b",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "postgresql"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "db.collection.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.collection.name",
"type": "tag"
},
{
"dataType": "string",
"id": "db.operation.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.operation.name",
"type": "tag"
}
],
"having": [],
"legend": "",
"limit": 15,
"orderBy": [],
"queryName": "B",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "count"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "A/1000000",
"legend": "P99 Latency (ms)",
"queryName": "F1"
}
]
},
"clickhouse_sql": [],
"id": "db-slow-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [
{
"dataType": "string",
"id": "serviceName--string--resource--false",
"isColumn": false,
"isJSON": false,
"key": "serviceName",
"type": "resource"
},
{
"dataType": "string",
"id": "body--string--body--true",
"isColumn": true,
"isJSON": false,
"key": "body",
"type": "body"
},
{
"dataType": "string",
"id": "severity_text--string----true",
"isColumn": true,
"isJSON": false,
"key": "severity_text",
"type": ""
}
],
"selectedTracesFields": [
{
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
{
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
{
"dataType": "string",
"id": "db.collection.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.collection.name",
"type": "tag"
},
{
"dataType": "string",
"id": "db.operation.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.operation.name",
"type": "tag"
}
],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Slowest DB Queries by Table",
"yAxisUnit": "short"
},
{
"description": "",
"id": "row-jobs",
"panelTypes": "row",
"title": "Background Jobs (BullMQ)"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Background job processing rate by queue",
"fillSpans": true,
"id": "job-throughput",
"isStacked": true,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "0.7",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-bullmq",
"key": {
"dataType": "string",
"id": "bullmq.queue.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "bullmq.queue.name",
"type": "tag"
},
"op": "exists",
"value": ""
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "bullmq.queue.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "bullmq.queue.name",
"type": "tag"
}
],
"having": [],
"legend": "{{bullmq.queue.name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": []
},
"clickhouse_sql": [],
"id": "job-throughput-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Job Throughput by Queue",
"yAxisUnit": "ops"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Background job processing latency (P95) by queue",
"fillSpans": false,
"id": "job-latency",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p95",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "=",
"value": "immich"
},
{
"id": "filter-bullmq",
"key": {
"dataType": "string",
"id": "bullmq.queue.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "bullmq.queue.name",
"type": "tag"
},
"op": "exists",
"value": ""
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "bullmq.queue.name--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "bullmq.queue.name",
"type": "tag"
}
],
"having": [],
"legend": "{{bullmq.queue.name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "p95",
"stepInterval": 60,
"timeAggregation": "p95"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "A/1000000",
"legend": "{{bullmq.queue.name}} P95",
"queryName": "F1"
}
]
},
"clickhouse_sql": [],
"id": "job-latency-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Job Latency (P95)",
"yAxisUnit": "ms"
},
{
"description": "",
"id": "row-redis",
"panelTypes": "row",
"title": "Redis Cache"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Redis operations per second by command",
"fillSpans": true,
"id": "redis-operations",
"isStacked": true,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "0.7",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "",
"id": "------false",
"isColumn": false,
"isJSON": false,
"key": "",
"type": ""
},
"aggregateOperator": "count",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-redis",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "redis"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "name--string----true",
"isColumn": true,
"isJSON": false,
"key": "name",
"type": ""
}
],
"having": [],
"legend": "{{name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "sum",
"stepInterval": 60,
"timeAggregation": "rate"
}
],
"queryFormulas": []
},
"clickhouse_sql": [],
"id": "redis-ops-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Redis Operations/sec",
"yAxisUnit": "ops"
},
{
"bucketCount": 30,
"bucketWidth": 0,
"columnUnits": {},
"description": "Redis command latency (P95) by operation",
"fillSpans": false,
"id": "redis-latency",
"isStacked": false,
"mergeAllActiveQueries": false,
"nullZeroValues": "zero",
"opacity": "1",
"panelTypes": "graph",
"query": {
"builder": {
"queryData": [
{
"aggregateAttribute": {
"dataType": "float64",
"id": "durationNano--float64----true",
"isColumn": true,
"isJSON": false,
"key": "durationNano",
"type": ""
},
"aggregateOperator": "p95",
"dataSource": "traces",
"disabled": false,
"expression": "A",
"filters": {
"items": [
{
"id": "filter-service",
"key": {
"dataType": "string",
"id": "serviceName--string--tag--true",
"isColumn": true,
"isJSON": false,
"key": "serviceName",
"type": "tag"
},
"op": "contains",
"value": "immich"
},
{
"id": "filter-redis",
"key": {
"dataType": "string",
"id": "db.system--string--tag--false",
"isColumn": false,
"isJSON": false,
"key": "db.system",
"type": "tag"
},
"op": "=",
"value": "redis"
}
],
"op": "AND"
},
"functions": [],
"groupBy": [
{
"dataType": "string",
"id": "name--string----true",
"isColumn": true,
"isJSON": false,
"key": "name",
"type": ""
}
],
"having": [],
"legend": "{{name}}",
"limit": null,
"orderBy": [],
"queryName": "A",
"reduceTo": "avg",
"spaceAggregation": "p95",
"stepInterval": 60,
"timeAggregation": "p95"
}
],
"queryFormulas": [
{
"disabled": false,
"expression": "A/1000000",
"legend": "{{name}} P95",
"queryName": "F1"
}
]
},
"clickhouse_sql": [],
"id": "redis-latency-query",
"promql": [],
"queryType": "builder"
},
"selectedLogFields": [],
"selectedTracesFields": [],
"softMax": null,
"softMin": 0,
"stackedBarChart": false,
"thresholds": [],
"timePreferance": "GLOBAL_TIME",
"title": "Redis Latency (P95)",
"yAxisUnit": "ms"
}
]
}