@emeryld/obs-stack 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -111,6 +111,15 @@ Adjust the `backend` service inside `examples/docker-compose.override.yml` to ma
111
111
  ## Grafana provisioning
112
112
 
113
113
  Grafana relies on the datasources defined in `grafana/provisioning/datasources/datasources.yaml` to wire up Loki and Tempo automatically. You never need to configure the data sources manually—just open Grafana at the URL reported by `obs-stack urls`.
114
+ Each datasource now exposes a stable `uid` (`loki` and `tempo`) so the shipping dashboards can reference them reliably.
115
+
116
+ We also preload three starter dashboards via `grafana/provisioning/dashboards/`. Each JSON file targets the Loki datasource (uid `loki`) so they work out of the box:
117
+
118
+ - **Logs overview**: table-based log stream plus a severity breakout to spot noisy services that are emitting within the selected time range.
119
+ - **Error spotlight**: graph of error rate per service, a recent error table, and a quick stat showing how many error events arrived over the past five minutes.
120
+ - **Service telemetry**: log rate by logger namespace, the top namespaces by volume, and a traced-log ratio that highlights how many records still carry `trace_id`.
121
+
122
+ Edit the JSON in `grafana/provisioning/dashboards/files/` (or export updates from Grafana) and restart the stack or reload dashboards to see your changes automatically.
114
123
 
115
124
  ## Troubleshooting
116
125
 
@@ -14,8 +14,9 @@ exporters:
14
14
  endpoint: tempo:4317
15
15
  tls:
16
16
  insecure: true
17
- otlphttp:
18
- endpoint: http://loki:3100/otlp
17
+
18
+ loki:
19
+ endpoint: http://loki:3100/loki/api/v1/push
19
20
 
20
21
  service:
21
22
  pipelines:
@@ -26,4 +27,4 @@ service:
26
27
  logs:
27
28
  receivers: [otlp]
28
29
  processors: [batch]
29
- exporters: [otlphttp]
30
+ exporters: [loki]
@@ -0,0 +1,9 @@
1
+ apiVersion: 1
2
+ providers:
3
+ - name: "obs-stack dashboards"
4
+ orgId: 1
5
+ folder: ""
6
+ type: file
7
+ disableDeletion: false
8
+ options:
9
+ path: /etc/grafana/provisioning/dashboards/files
@@ -0,0 +1,209 @@
1
+ {
2
+ "annotations": {
3
+ "list": [
4
+ {
5
+ "builtIn": 1,
6
+ "datasource": {
7
+ "type": "grafana",
8
+ "uid": "-- Grafana --"
9
+ },
10
+ "enable": true,
11
+ "hide": true,
12
+ "iconColor": "rgba(0, 211, 255, 1)",
13
+ "name": "Annotations & Alerts",
14
+ "type": "dashboard"
15
+ }
16
+ ]
17
+ },
18
+ "editable": true,
19
+ "gnetId": null,
20
+ "graphTooltip": 0,
21
+ "id": null,
22
+ "links": [],
23
+ "liveNow": false,
24
+ "panels": [
25
+ {
26
+ "datasource": {
27
+ "type": "loki",
28
+ "uid": "loki"
29
+ },
30
+ "fieldConfig": {
31
+ "defaults": {
32
+ "custom": {},
33
+ "mappings": [],
34
+ "thresholds": {
35
+ "mode": "absolute",
36
+ "steps": [
37
+ {
38
+ "color": "green",
39
+ "value": null
40
+ }
41
+ ]
42
+ },
43
+ "unit": "short"
44
+ },
45
+ "overrides": []
46
+ },
47
+ "gridPos": {
48
+ "h": 8,
49
+ "w": 12,
50
+ "x": 0,
51
+ "y": 0
52
+ },
53
+ "id": 1,
54
+ "options": {
55
+ "legend": {
56
+ "displayMode": "list",
57
+ "placement": "bottom"
58
+ }
59
+ },
60
+ "targets": [
61
+ {
62
+ "datasource": {
63
+ "type": "loki",
64
+ "uid": "loki"
65
+ },
66
+ "expr": "sum(rate({severityText=\"ERROR\", service_name=~\"$service_name\"}[1m])) by (service_name)",
67
+ "queryType": "range",
68
+ "refId": "A"
69
+ }
70
+ ],
71
+ "title": "Error rate per service",
72
+ "type": "timeseries"
73
+ },
74
+ {
75
+ "datasource": {
76
+ "type": "loki",
77
+ "uid": "loki"
78
+ },
79
+ "fieldConfig": {
80
+ "defaults": {
81
+ "custom": {},
82
+ "mappings": [],
83
+ "thresholds": {
84
+ "mode": "absolute",
85
+ "steps": [
86
+ {
87
+ "color": "green",
88
+ "value": null
89
+ }
90
+ ]
91
+ }
92
+ },
93
+ "overrides": []
94
+ },
95
+ "gridPos": {
96
+ "h": 8,
97
+ "w": 12,
98
+ "x": 0,
99
+ "y": 8
100
+ },
101
+ "id": 2,
102
+ "options": {
103
+ "showHeader": true
104
+ },
105
+ "targets": [
106
+ {
107
+ "datasource": {
108
+ "type": "loki",
109
+ "uid": "loki"
110
+ },
111
+ "expr": "{severityText=\"ERROR\", service_name=~\"$service_name\"}",
112
+ "queryType": "range",
113
+ "refId": "A"
114
+ }
115
+ ],
116
+ "title": "Recent errors",
117
+ "type": "table"
118
+ },
119
+ {
120
+ "datasource": {
121
+ "type": "loki",
122
+ "uid": "loki"
123
+ },
124
+ "fieldConfig": {
125
+ "defaults": {
126
+ "custom": {},
127
+ "mappings": [],
128
+ "unit": "short"
129
+ },
130
+ "overrides": []
131
+ },
132
+ "gridPos": {
133
+ "h": 4,
134
+ "w": 12,
135
+ "x": 0,
136
+ "y": 16
137
+ },
138
+ "id": 3,
139
+ "options": {
140
+ "orientation": "horizontal",
141
+ "reduceOptions": {
142
+ "calcs": [
143
+ "sum"
144
+ ],
145
+ "fields": "",
146
+ "values": false
147
+ },
148
+ "textMode": "auto"
149
+ },
150
+ "targets": [
151
+ {
152
+ "datasource": {
153
+ "type": "loki",
154
+ "uid": "loki"
155
+ },
156
+ "expr": "sum(count_over_time({severityText=\"ERROR\", service_name=~\"$service_name\"}[5m]))",
157
+ "queryType": "range",
158
+ "refId": "A"
159
+ }
160
+ ],
161
+ "title": "Errors in last 5 minutes",
162
+ "type": "stat"
163
+ }
164
+ ],
165
+ "refresh": "5s",
166
+ "schemaVersion": 38,
167
+ "style": "dark",
168
+ "tags": [
169
+ "errors",
170
+ "alerts",
171
+ "logs"
172
+ ],
173
+ "templating": {
174
+ "list": [
175
+ {
176
+ "allValue": ".*",
177
+ "datasource": {
178
+ "type": "loki",
179
+ "uid": "loki"
180
+ },
181
+ "definition": "label_values({service_name!=\"\"}, service_name)",
182
+ "includeAll": true,
183
+ "label": "Service",
184
+ "multi": false,
185
+ "name": "service_name",
186
+ "options": [],
187
+ "query": "label_values({service_name!=\"\"}, service_name)",
188
+ "refresh": 2,
189
+ "skipUrlSync": false,
190
+ "type": "query",
191
+ "useTags": false,
192
+ "current": {
193
+ "text": "All services",
194
+ "value": ".*"
195
+ }
196
+ }
197
+ ]
198
+ },
199
+ "time": {
200
+ "from": "now-1h",
201
+ "to": "now"
202
+ },
203
+ "timepicker": {},
204
+ "timezone": "browser",
205
+ "title": "Error spotlight",
206
+ "uid": "error-spotlight",
207
+ "version": 1,
208
+ "weekStart": ""
209
+ }
@@ -0,0 +1,169 @@
1
+ {
2
+ "annotations": {
3
+ "list": [
4
+ {
5
+ "builtIn": 1,
6
+ "datasource": {
7
+ "type": "grafana",
8
+ "uid": "-- Grafana --"
9
+ },
10
+ "enable": true,
11
+ "hide": true,
12
+ "iconColor": "rgba(0, 211, 255, 1)",
13
+ "name": "Annotations & Alerts",
14
+ "type": "dashboard"
15
+ }
16
+ ]
17
+ },
18
+ "editable": true,
19
+ "gnetId": null,
20
+ "graphTooltip": 0,
21
+ "id": null,
22
+ "links": [],
23
+ "liveNow": false,
24
+ "panels": [
25
+ {
26
+ "datasource": {
27
+ "type": "loki",
28
+ "uid": "loki"
29
+ },
30
+ "fieldConfig": {
31
+ "defaults": {
32
+ "custom": {},
33
+ "mappings": [],
34
+ "thresholds": {
35
+ "mode": "absolute",
36
+ "steps": [
37
+ {
38
+ "color": "green",
39
+ "value": null
40
+ }
41
+ ]
42
+ }
43
+ },
44
+ "overrides": []
45
+ },
46
+ "gridPos": {
47
+ "h": 12,
48
+ "w": 12,
49
+ "x": 0,
50
+ "y": 0
51
+ },
52
+ "id": 1,
53
+ "options": {
54
+ "showLabels": true,
55
+ "showTime": true,
56
+ "wrapLogMessage": true
57
+ },
58
+ "targets": [
59
+ {
60
+ "datasource": {
61
+ "type": "loki",
62
+ "uid": "loki"
63
+ },
64
+ "editorMode": "builder",
65
+ "expr": "{service_name=~\"$service_name\"}",
66
+ "queryType": "range",
67
+ "refId": "A"
68
+ }
69
+ ],
70
+ "title": "Log stream",
71
+ "type": "logs"
72
+ },
73
+ {
74
+ "datasource": {
75
+ "type": "loki",
76
+ "uid": "loki"
77
+ },
78
+ "fieldConfig": {
79
+ "defaults": {
80
+ "custom": {},
81
+ "mappings": [],
82
+ "thresholds": {
83
+ "mode": "absolute",
84
+ "steps": [
85
+ {
86
+ "color": "green",
87
+ "value": null
88
+ }
89
+ ]
90
+ },
91
+ "unit": "short"
92
+ },
93
+ "overrides": []
94
+ },
95
+ "gridPos": {
96
+ "h": 8,
97
+ "w": 12,
98
+ "x": 0,
99
+ "y": 12
100
+ },
101
+ "id": 2,
102
+ "options": {
103
+ "legend": {
104
+ "displayMode": "list",
105
+ "placement": "bottom"
106
+ },
107
+ "tooltip": {
108
+ "mode": "single"
109
+ }
110
+ },
111
+ "targets": [
112
+ {
113
+ "datasource": {
114
+ "type": "loki",
115
+ "uid": "loki"
116
+ },
117
+ "expr": "sum(rate({service_name=~\"$service_name\"}[5m])) by (severityText)",
118
+ "queryType": "range",
119
+ "refId": "A"
120
+ }
121
+ ],
122
+ "title": "Log rate by severity",
123
+ "type": "timeseries"
124
+ }
125
+ ],
126
+ "refresh": "15s",
127
+ "schemaVersion": 38,
128
+ "style": "dark",
129
+ "tags": [
130
+ "logs",
131
+ "observability"
132
+ ],
133
+ "templating": {
134
+ "list": [
135
+ {
136
+ "allValue": ".*",
137
+ "datasource": {
138
+ "type": "loki",
139
+ "uid": "loki"
140
+ },
141
+ "definition": "label_values({service_name!=\"\"}, service_name)",
142
+ "includeAll": true,
143
+ "label": "Service",
144
+ "multi": false,
145
+ "name": "service_name",
146
+ "options": [],
147
+ "query": "label_values({service_name!=\"\"}, service_name)",
148
+ "refresh": 2,
149
+ "skipUrlSync": false,
150
+ "type": "query",
151
+ "useTags": false,
152
+ "current": {
153
+ "text": "All services",
154
+ "value": ".*"
155
+ }
156
+ }
157
+ ]
158
+ },
159
+ "time": {
160
+ "from": "now-6h",
161
+ "to": "now"
162
+ },
163
+ "timepicker": {},
164
+ "timezone": "browser",
165
+ "title": "Logs overview",
166
+ "uid": "logs-overview",
167
+ "version": 1,
168
+ "weekStart": ""
169
+ }
@@ -0,0 +1,211 @@
1
+ {
2
+ "annotations": {
3
+ "list": [
4
+ {
5
+ "builtIn": 1,
6
+ "datasource": {
7
+ "type": "grafana",
8
+ "uid": "-- Grafana --"
9
+ },
10
+ "enable": true,
11
+ "hide": true,
12
+ "iconColor": "rgba(0, 211, 255, 1)",
13
+ "name": "Annotations & Alerts",
14
+ "type": "dashboard"
15
+ }
16
+ ]
17
+ },
18
+ "editable": true,
19
+ "gnetId": null,
20
+ "graphTooltip": 0,
21
+ "id": null,
22
+ "links": [],
23
+ "liveNow": false,
24
+ "panels": [
25
+ {
26
+ "datasource": {
27
+ "type": "loki",
28
+ "uid": "loki"
29
+ },
30
+ "fieldConfig": {
31
+ "defaults": {
32
+ "custom": {},
33
+ "mappings": [],
34
+ "thresholds": {
35
+ "mode": "absolute",
36
+ "steps": [
37
+ {
38
+ "color": "green",
39
+ "value": null
40
+ }
41
+ ]
42
+ },
43
+ "unit": "short"
44
+ },
45
+ "overrides": []
46
+ },
47
+ "gridPos": {
48
+ "h": 8,
49
+ "w": 12,
50
+ "x": 0,
51
+ "y": 0
52
+ },
53
+ "id": 1,
54
+ "options": {
55
+ "legend": {
56
+ "displayMode": "list",
57
+ "placement": "bottom"
58
+ },
59
+ "tooltip": {
60
+ "mode": "single"
61
+ }
62
+ },
63
+ "targets": [
64
+ {
65
+ "datasource": {
66
+ "type": "loki",
67
+ "uid": "loki"
68
+ },
69
+ "expr": "sum(rate({service_name=~\"$service_name\"}[5m])) by (logger_name)",
70
+ "queryType": "range",
71
+ "refId": "A"
72
+ }
73
+ ],
74
+ "title": "Log rate by logger",
75
+ "type": "timeseries"
76
+ },
77
+ {
78
+ "datasource": {
79
+ "type": "loki",
80
+ "uid": "loki"
81
+ },
82
+ "fieldConfig": {
83
+ "defaults": {
84
+ "custom": {},
85
+ "mappings": [],
86
+ "thresholds": {
87
+ "mode": "absolute",
88
+ "steps": [
89
+ {
90
+ "color": "green",
91
+ "value": null
92
+ }
93
+ ]
94
+ }
95
+ },
96
+ "overrides": []
97
+ },
98
+ "gridPos": {
99
+ "h": 8,
100
+ "w": 12,
101
+ "x": 0,
102
+ "y": 8
103
+ },
104
+ "id": 2,
105
+ "options": {
106
+ "showHeader": true
107
+ },
108
+ "targets": [
109
+ {
110
+ "datasource": {
111
+ "type": "loki",
112
+ "uid": "loki"
113
+ },
114
+ "expr": "topk(10, sum by (logger_name) (count_over_time({service_name=~\"$service_name\"}[5m])))",
115
+ "queryType": "range",
116
+ "refId": "A"
117
+ }
118
+ ],
119
+ "title": "Top log namespaces",
120
+ "type": "table"
121
+ },
122
+ {
123
+ "datasource": {
124
+ "type": "loki",
125
+ "uid": "loki"
126
+ },
127
+ "fieldConfig": {
128
+ "defaults": {
129
+ "custom": {},
130
+ "mappings": [],
131
+ "unit": "percent"
132
+ },
133
+ "overrides": []
134
+ },
135
+ "gridPos": {
136
+ "h": 4,
137
+ "w": 12,
138
+ "x": 0,
139
+ "y": 16
140
+ },
141
+ "id": 3,
142
+ "options": {
143
+ "orientation": "horizontal",
144
+ "reduceOptions": {
145
+ "calcs": [
146
+ "mean"
147
+ ],
148
+ "fields": "",
149
+ "values": false
150
+ },
151
+ "textMode": "auto"
152
+ },
153
+ "targets": [
154
+ {
155
+ "datasource": {
156
+ "type": "loki",
157
+ "uid": "loki"
158
+ },
159
+ "expr": "sum(count_over_time({trace_id!=\"\", service_name=~\"$service_name\"}[5m])) / sum(count_over_time({service_name=~\"$service_name\"}[5m])) * 100",
160
+ "queryType": "range",
161
+ "refId": "A"
162
+ }
163
+ ],
164
+ "title": "Traced logs",
165
+ "type": "stat"
166
+ }
167
+ ],
168
+ "refresh": "10s",
169
+ "schemaVersion": 38,
170
+ "style": "dark",
171
+ "tags": [
172
+ "service",
173
+ "telemetry"
174
+ ],
175
+ "templating": {
176
+ "list": [
177
+ {
178
+ "allValue": ".*",
179
+ "datasource": {
180
+ "type": "loki",
181
+ "uid": "loki"
182
+ },
183
+ "definition": "label_values({service_name!=\"\"}, service_name)",
184
+ "includeAll": true,
185
+ "label": "Service",
186
+ "multi": false,
187
+ "name": "service_name",
188
+ "options": [],
189
+ "query": "label_values({service_name!=\"\"}, service_name)",
190
+ "refresh": 2,
191
+ "skipUrlSync": false,
192
+ "type": "query",
193
+ "useTags": false,
194
+ "current": {
195
+ "text": "All services",
196
+ "value": ".*"
197
+ }
198
+ }
199
+ ]
200
+ },
201
+ "time": {
202
+ "from": "now-1h",
203
+ "to": "now"
204
+ },
205
+ "timepicker": {},
206
+ "timezone": "browser",
207
+ "title": "Service telemetry",
208
+ "uid": "service-telemetry",
209
+ "version": 1,
210
+ "weekStart": ""
211
+ }
@@ -1,6 +1,7 @@
1
1
  apiVersion: 1
2
2
  datasources:
3
3
  - name: Loki
4
+ uid: loki
4
5
  type: loki
5
6
  access: proxy
6
7
  orgId: 1
@@ -9,6 +10,7 @@ datasources:
9
10
  jsonData:
10
11
  min_refresh_interval: "5s"
11
12
  - name: Tempo
13
+ uid: tempo
12
14
  type: tempo
13
15
  access: proxy
14
16
  orgId: 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emeryld/obs-stack",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "Docker Compose-based Grafana + Tempo + Loki + OpenTelemetry Collector stack",
5
5
  "type": "commonjs",
6
6
  "bin": {