container-superposition 0.1.1 → 0.1.4
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 +569 -8
- package/dist/scripts/init.js +436 -254
- package/dist/scripts/init.js.map +1 -1
- package/dist/tool/commands/doctor.d.ts +15 -0
- package/dist/tool/commands/doctor.d.ts.map +1 -0
- package/dist/tool/commands/doctor.js +862 -0
- package/dist/tool/commands/doctor.js.map +1 -0
- package/dist/tool/commands/explain.d.ts +13 -0
- package/dist/tool/commands/explain.d.ts.map +1 -0
- package/dist/tool/commands/explain.js +299 -0
- package/dist/tool/commands/explain.js.map +1 -0
- package/dist/tool/commands/list.d.ts +16 -0
- package/dist/tool/commands/list.d.ts.map +1 -0
- package/dist/tool/commands/list.js +121 -0
- package/dist/tool/commands/list.js.map +1 -0
- package/dist/tool/commands/plan.d.ts +67 -0
- package/dist/tool/commands/plan.d.ts.map +1 -0
- package/dist/tool/commands/plan.js +851 -0
- package/dist/tool/commands/plan.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +16 -2
- package/dist/tool/questionnaire/composer.d.ts.map +1 -1
- package/dist/tool/questionnaire/composer.js +411 -200
- package/dist/tool/questionnaire/composer.js.map +1 -1
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -1
- package/dist/tool/readme/markdown-parser.js.map +1 -1
- package/dist/tool/readme/readme-generator.d.ts.map +1 -1
- package/dist/tool/readme/readme-generator.js +11 -6
- package/dist/tool/readme/readme-generator.js.map +1 -1
- package/dist/tool/schema/deployment-targets.d.ts +77 -0
- package/dist/tool/schema/deployment-targets.d.ts.map +1 -0
- package/dist/tool/schema/deployment-targets.js +91 -0
- package/dist/tool/schema/deployment-targets.js.map +1 -0
- package/dist/tool/schema/manifest-migrations.d.ts +51 -0
- package/dist/tool/schema/manifest-migrations.d.ts.map +1 -0
- package/dist/tool/schema/manifest-migrations.js +159 -0
- package/dist/tool/schema/manifest-migrations.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +1 -1
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
- package/dist/tool/schema/overlay-loader.js +42 -14
- package/dist/tool/schema/overlay-loader.js.map +1 -1
- package/dist/tool/schema/types.d.ts +62 -2
- package/dist/tool/schema/types.d.ts.map +1 -1
- package/dist/tool/utils/gitignore.d.ts +15 -0
- package/dist/tool/utils/gitignore.d.ts.map +1 -0
- package/dist/tool/utils/gitignore.js +41 -0
- package/dist/tool/utils/gitignore.js.map +1 -0
- package/dist/tool/utils/merge.d.ts +134 -0
- package/dist/tool/utils/merge.d.ts.map +1 -0
- package/dist/tool/utils/merge.js +277 -0
- package/dist/tool/utils/merge.js.map +1 -0
- package/dist/tool/utils/port-utils.d.ts +29 -0
- package/dist/tool/utils/port-utils.d.ts.map +1 -0
- package/dist/tool/utils/port-utils.js +128 -0
- package/dist/tool/utils/port-utils.js.map +1 -0
- package/dist/tool/utils/services-export.d.ts +14 -0
- package/dist/tool/utils/services-export.d.ts.map +1 -0
- package/dist/tool/utils/services-export.js +478 -0
- package/dist/tool/utils/services-export.js.map +1 -0
- package/dist/tool/utils/summary.d.ts +69 -0
- package/dist/tool/utils/summary.d.ts.map +1 -0
- package/dist/tool/utils/summary.js +260 -0
- package/dist/tool/utils/summary.js.map +1 -0
- package/dist/tool/utils/version.d.ts +9 -0
- package/dist/tool/utils/version.d.ts.map +1 -0
- package/dist/tool/utils/version.js +32 -0
- package/dist/tool/utils/version.js.map +1 -0
- package/docs/architecture.md +25 -21
- package/docs/deployment-targets.md +150 -0
- package/docs/discovery-commands.md +442 -0
- package/docs/merge-strategy.md +700 -0
- package/docs/minimal-and-editor.md +265 -0
- package/docs/overlay-imports.md +209 -0
- package/docs/overlay-manifest-refactoring.md +2 -2
- package/docs/overlay-metadata-archive.md +1 -1
- package/docs/overlays.md +139 -28
- package/docs/presets-architecture.md +3 -3
- package/docs/presets.md +1 -1
- package/docs/publishing.md +36 -35
- package/docs/team-workflow.md +540 -0
- package/overlays/.presets/data-engineering.yml +392 -0
- package/overlays/.presets/event-sourced-service.yml +262 -0
- package/overlays/.presets/frontend.yml +287 -0
- package/overlays/.presets/k8s-operator-dev.yml +462 -0
- package/overlays/{presets → .presets}/microservice.yml +32 -6
- package/overlays/.presets/web-api.yml +129 -0
- package/overlays/.registry/README.md +1 -1
- package/overlays/.registry/deployment-targets.yml +54 -0
- package/overlays/.shared/README.md +43 -0
- package/overlays/.shared/compose/common-healthchecks.yml +38 -0
- package/overlays/.shared/otel/instrumentation.env +20 -0
- package/overlays/.shared/otel/otel-base-config.yaml +30 -0
- package/overlays/.shared/vscode/recommended-extensions.json +14 -0
- package/overlays/README.md +1 -1
- package/overlays/cloudflared/README.md +190 -0
- package/overlays/cloudflared/devcontainer.patch.json +3 -0
- package/overlays/cloudflared/overlay.yml +15 -0
- package/overlays/cloudflared/setup.sh +49 -0
- package/overlays/cloudflared/verify.sh +21 -0
- package/overlays/codex/overlay.yml +1 -0
- package/overlays/direnv/README.md +6 -4
- package/overlays/direnv/setup.sh +0 -12
- package/overlays/duckdb/README.md +274 -0
- package/overlays/duckdb/devcontainer.patch.json +10 -0
- package/overlays/duckdb/overlay.yml +17 -0
- package/overlays/duckdb/setup.sh +45 -0
- package/overlays/duckdb/verify.sh +32 -0
- package/overlays/git-helpers/overlay.yml +1 -0
- package/overlays/grafana/README.md +5 -5
- package/overlays/grafana/dashboard-provider.yml +1 -1
- package/overlays/grafana/docker-compose.yml +2 -2
- package/overlays/grafana/overlay.yml +6 -1
- package/overlays/grpc-tools/README.md +242 -0
- package/overlays/grpc-tools/devcontainer.patch.json +14 -0
- package/overlays/grpc-tools/overlay.yml +14 -0
- package/overlays/grpc-tools/setup.sh +57 -0
- package/overlays/grpc-tools/verify.sh +47 -0
- package/overlays/jaeger/overlay.yml +16 -3
- package/overlays/jupyter/.env.example +6 -0
- package/overlays/jupyter/README.md +210 -0
- package/overlays/jupyter/devcontainer.patch.json +14 -0
- package/overlays/jupyter/docker-compose.yml +23 -0
- package/overlays/jupyter/overlay.yml +18 -0
- package/overlays/jupyter/verify.sh +35 -0
- package/overlays/keycloak/.env.example +5 -0
- package/overlays/keycloak/README.md +238 -0
- package/overlays/keycloak/devcontainer.patch.json +17 -0
- package/overlays/keycloak/docker-compose.yml +32 -0
- package/overlays/keycloak/overlay.yml +23 -0
- package/overlays/keycloak/verify.sh +54 -0
- package/overlays/kind/README.md +221 -0
- package/overlays/kind/devcontainer.patch.json +10 -0
- package/overlays/kind/overlay.yml +18 -0
- package/overlays/kind/setup.sh +43 -0
- package/overlays/kind/verify.sh +40 -0
- package/overlays/localstack/.env.example +6 -0
- package/overlays/localstack/README.md +188 -0
- package/overlays/localstack/devcontainer.patch.json +21 -0
- package/overlays/localstack/docker-compose.yml +25 -0
- package/overlays/localstack/overlay.yml +18 -0
- package/overlays/localstack/verify.sh +47 -0
- package/overlays/loki/overlay.yml +6 -1
- package/overlays/mailpit/.env.example +4 -0
- package/overlays/mailpit/README.md +191 -0
- package/overlays/mailpit/devcontainer.patch.json +20 -0
- package/overlays/mailpit/docker-compose.yml +17 -0
- package/overlays/mailpit/overlay.yml +26 -0
- package/overlays/mailpit/verify.sh +52 -0
- package/overlays/modern-cli-tools/overlay.yml +1 -0
- package/overlays/mongodb/overlay.yml +12 -2
- package/overlays/mysql/overlay.yml +12 -2
- package/overlays/nats/overlay.yml +12 -2
- package/overlays/ngrok/overlay.yml +2 -1
- package/overlays/openapi-tools/README.md +243 -0
- package/overlays/openapi-tools/devcontainer.patch.json +10 -0
- package/overlays/openapi-tools/overlay.yml +16 -0
- package/overlays/openapi-tools/setup.sh +45 -0
- package/overlays/openapi-tools/verify.sh +51 -0
- package/overlays/otel-collector/overlay.yml.example +26 -0
- package/overlays/postgres/overlay.yml +6 -1
- package/overlays/prometheus/overlay.yml +6 -1
- package/overlays/python/README.md +51 -35
- package/overlays/python/devcontainer.patch.json +7 -4
- package/overlays/python/setup.sh +50 -23
- package/overlays/python/verify.sh +29 -1
- package/overlays/rabbitmq/overlay.yml +12 -2
- package/overlays/redis/overlay.yml +6 -1
- package/overlays/tilt/README.md +259 -0
- package/overlays/tilt/devcontainer.patch.json +17 -0
- package/overlays/tilt/overlay.yml +19 -0
- package/overlays/tilt/setup.sh +25 -0
- package/overlays/tilt/verify.sh +24 -0
- package/package.json +8 -6
- package/tool/README.md +12 -16
- package/tool/schema/overlay-manifest.schema.json +64 -4
- package/tool/schema/superposition-manifest.schema.json +104 -0
- package/overlays/presets/web-api.yml +0 -109
- /package/overlays/{presets → .presets}/docs-site.yml +0 -0
- /package/overlays/{presets → .presets}/fullstack.yml +0 -0
|
@@ -68,11 +68,58 @@
|
|
|
68
68
|
},
|
|
69
69
|
"ports": {
|
|
70
70
|
"type": "array",
|
|
71
|
-
"description": "Ports used by the overlay (for offset calculation)",
|
|
71
|
+
"description": "Ports used by the overlay (for offset calculation and documentation)",
|
|
72
72
|
"items": {
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
"oneOf": [
|
|
74
|
+
{
|
|
75
|
+
"type": "integer",
|
|
76
|
+
"minimum": 1,
|
|
77
|
+
"maximum": 65535,
|
|
78
|
+
"description": "Simple port number (legacy format)"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"type": "object",
|
|
82
|
+
"description": "Rich port metadata with service info and connection details",
|
|
83
|
+
"required": ["port"],
|
|
84
|
+
"properties": {
|
|
85
|
+
"port": {
|
|
86
|
+
"type": "integer",
|
|
87
|
+
"minimum": 1,
|
|
88
|
+
"maximum": 65535,
|
|
89
|
+
"description": "Port number"
|
|
90
|
+
},
|
|
91
|
+
"service": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"description": "Service name (e.g., postgres, grafana, jaeger)",
|
|
94
|
+
"pattern": "^[a-z0-9-]+$"
|
|
95
|
+
},
|
|
96
|
+
"protocol": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"description": "Protocol type",
|
|
99
|
+
"enum": ["http", "https", "tcp", "udp", "grpc"]
|
|
100
|
+
},
|
|
101
|
+
"description": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"description": "Human-readable description of what this port is for"
|
|
104
|
+
},
|
|
105
|
+
"path": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"description": "Default path for HTTP/HTTPS services (e.g., /, /metrics)",
|
|
108
|
+
"pattern": "^/"
|
|
109
|
+
},
|
|
110
|
+
"onAutoForward": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"description": "VS Code port auto-forward behavior",
|
|
113
|
+
"enum": ["notify", "openBrowser", "openPreview", "silent", "ignore"]
|
|
114
|
+
},
|
|
115
|
+
"connectionStringTemplate": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"description": "Template for connection string (e.g., postgresql://{user}:{password}@{host}:{port}/{database})"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"additionalProperties": false
|
|
121
|
+
}
|
|
122
|
+
]
|
|
76
123
|
},
|
|
77
124
|
"default": []
|
|
78
125
|
},
|
|
@@ -80,6 +127,19 @@
|
|
|
80
127
|
"type": "integer",
|
|
81
128
|
"description": "Display order within category (lower = first)",
|
|
82
129
|
"minimum": 1
|
|
130
|
+
},
|
|
131
|
+
"imports": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"description": "Shared files to import from overlays/.shared/",
|
|
134
|
+
"items": {
|
|
135
|
+
"type": "string"
|
|
136
|
+
},
|
|
137
|
+
"default": []
|
|
138
|
+
},
|
|
139
|
+
"minimal": {
|
|
140
|
+
"type": "boolean",
|
|
141
|
+
"description": "Whether this overlay is excluded in minimal mode (true = extra/optional)",
|
|
142
|
+
"default": false
|
|
83
143
|
}
|
|
84
144
|
},
|
|
85
145
|
"additionalProperties": false
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"title": "Superposition Manifest",
|
|
5
|
+
"description": "Manifest file (superposition.json) generated by container-superposition to track devcontainer configuration",
|
|
6
|
+
"properties": {
|
|
7
|
+
"manifestVersion": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"description": "Schema version of the manifest (increments on breaking changes)",
|
|
10
|
+
"pattern": "^[0-9]+$"
|
|
11
|
+
},
|
|
12
|
+
"generatedBy": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Version of container-superposition that created this manifest"
|
|
15
|
+
},
|
|
16
|
+
"version": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Legacy field for backward compatibility (deprecated, use manifestVersion instead)"
|
|
19
|
+
},
|
|
20
|
+
"generated": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"format": "date-time",
|
|
23
|
+
"description": "ISO 8601 timestamp when the manifest was generated"
|
|
24
|
+
},
|
|
25
|
+
"baseTemplate": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"enum": ["plain", "compose"],
|
|
28
|
+
"description": "Base devcontainer template used (plain for single image, compose for multi-service)"
|
|
29
|
+
},
|
|
30
|
+
"baseImage": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Base container image used for the devcontainer"
|
|
33
|
+
},
|
|
34
|
+
"overlays": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": {
|
|
37
|
+
"type": "string"
|
|
38
|
+
},
|
|
39
|
+
"description": "List of overlay IDs that were applied to create this configuration"
|
|
40
|
+
},
|
|
41
|
+
"portOffset": {
|
|
42
|
+
"type": "number",
|
|
43
|
+
"minimum": 0,
|
|
44
|
+
"description": "Port offset applied to all service ports (optional)"
|
|
45
|
+
},
|
|
46
|
+
"preset": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"description": "ID of the preset used to generate this configuration (optional)"
|
|
49
|
+
},
|
|
50
|
+
"presetChoices": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"additionalProperties": {
|
|
53
|
+
"type": "string"
|
|
54
|
+
},
|
|
55
|
+
"description": "User choices made within preset user-choice sections (optional)"
|
|
56
|
+
},
|
|
57
|
+
"autoResolved": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"properties": {
|
|
60
|
+
"added": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"items": {
|
|
63
|
+
"type": "string"
|
|
64
|
+
},
|
|
65
|
+
"description": "List of overlays that were automatically added as dependencies"
|
|
66
|
+
},
|
|
67
|
+
"reason": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "Human-readable reason why dependencies were added"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"required": ["added", "reason"],
|
|
73
|
+
"description": "Information about automatically resolved dependencies (optional)"
|
|
74
|
+
},
|
|
75
|
+
"containerName": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"description": "Name of the container/project from devcontainer.json (optional)"
|
|
78
|
+
},
|
|
79
|
+
"customizations": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"properties": {
|
|
82
|
+
"enabled": {
|
|
83
|
+
"type": "boolean",
|
|
84
|
+
"description": "Whether custom patches are enabled"
|
|
85
|
+
},
|
|
86
|
+
"location": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Path to custom patches directory relative to workspace"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"required": ["enabled", "location"],
|
|
92
|
+
"description": "Information about custom patches/overrides (optional)"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"required": [
|
|
96
|
+
"manifestVersion",
|
|
97
|
+
"generatedBy",
|
|
98
|
+
"generated",
|
|
99
|
+
"baseTemplate",
|
|
100
|
+
"baseImage",
|
|
101
|
+
"overlays"
|
|
102
|
+
],
|
|
103
|
+
"additionalProperties": false
|
|
104
|
+
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# Web API Stack Preset
|
|
2
|
-
# Complete environment for REST/GraphQL API development
|
|
3
|
-
|
|
4
|
-
id: web-api
|
|
5
|
-
name: Web API Stack
|
|
6
|
-
description: Complete REST/GraphQL API development environment with database, cache, and observability
|
|
7
|
-
type: meta
|
|
8
|
-
category: preset
|
|
9
|
-
supports: [compose] # Requires Docker Compose for services
|
|
10
|
-
tags: [preset, api, web, backend, observability]
|
|
11
|
-
|
|
12
|
-
# Overlays to select
|
|
13
|
-
selects:
|
|
14
|
-
# Always included
|
|
15
|
-
required:
|
|
16
|
-
- postgres
|
|
17
|
-
- redis
|
|
18
|
-
- otel-collector
|
|
19
|
-
- prometheus
|
|
20
|
-
- grafana
|
|
21
|
-
- loki
|
|
22
|
-
|
|
23
|
-
# User makes choices
|
|
24
|
-
userChoice:
|
|
25
|
-
language:
|
|
26
|
-
id: language
|
|
27
|
-
prompt: Select API language/framework
|
|
28
|
-
options: [dotnet, nodejs, python, go, java]
|
|
29
|
-
defaultOption: nodejs
|
|
30
|
-
|
|
31
|
-
# Glue configuration - integration helpers
|
|
32
|
-
glueConfig:
|
|
33
|
-
# Pre-configured environment variables
|
|
34
|
-
environment:
|
|
35
|
-
# Database connection
|
|
36
|
-
DATABASE_URL: 'postgresql://postgres:postgres@postgres:5432/myapp'
|
|
37
|
-
POSTGRES_HOST: 'postgres'
|
|
38
|
-
POSTGRES_PORT: '5432'
|
|
39
|
-
POSTGRES_DB: 'myapp'
|
|
40
|
-
POSTGRES_USER: 'postgres'
|
|
41
|
-
POSTGRES_PASSWORD: 'postgres'
|
|
42
|
-
|
|
43
|
-
# Redis connection
|
|
44
|
-
REDIS_URL: 'redis://redis:6379'
|
|
45
|
-
REDIS_HOST: 'redis'
|
|
46
|
-
REDIS_PORT: '6379'
|
|
47
|
-
|
|
48
|
-
# OpenTelemetry configuration
|
|
49
|
-
OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel-collector:4317'
|
|
50
|
-
OTEL_SERVICE_NAME: 'api-service'
|
|
51
|
-
OTEL_METRICS_EXPORTER: 'otlp'
|
|
52
|
-
OTEL_TRACES_EXPORTER: 'otlp'
|
|
53
|
-
OTEL_LOGS_EXPORTER: 'otlp'
|
|
54
|
-
|
|
55
|
-
# Suggested port mappings
|
|
56
|
-
portMappings:
|
|
57
|
-
api: 8000
|
|
58
|
-
grafana: 3000
|
|
59
|
-
prometheus: 9090
|
|
60
|
-
|
|
61
|
-
# README snippet to add to generated devcontainer
|
|
62
|
-
readme: |
|
|
63
|
-
## Web API Stack
|
|
64
|
-
|
|
65
|
-
This devcontainer is configured with a complete API development stack:
|
|
66
|
-
|
|
67
|
-
### Services
|
|
68
|
-
|
|
69
|
-
- **PostgreSQL**: Primary database (port 5432)
|
|
70
|
-
- **Redis**: Cache and session store (port 6379)
|
|
71
|
-
- **OpenTelemetry Collector**: Telemetry aggregation (ports 4317, 4318)
|
|
72
|
-
- **Prometheus**: Metrics storage (port 9090)
|
|
73
|
-
- **Grafana**: Observability dashboard (port 3000)
|
|
74
|
-
- **Loki**: Log aggregation (port 3100)
|
|
75
|
-
|
|
76
|
-
### Connection Strings
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
# PostgreSQL
|
|
80
|
-
DATABASE_URL="postgresql://postgres:postgres@postgres:5432/myapp"
|
|
81
|
-
|
|
82
|
-
# Redis
|
|
83
|
-
REDIS_URL="redis://redis:6379"
|
|
84
|
-
|
|
85
|
-
# OpenTelemetry
|
|
86
|
-
OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4317"
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### Quick Start
|
|
90
|
-
|
|
91
|
-
1. Start your API on port 8000 (configured in this preset)
|
|
92
|
-
2. Access Grafana at http://localhost:3000 (admin/admin)
|
|
93
|
-
3. View metrics in Prometheus at http://localhost:9090
|
|
94
|
-
4. Check logs in Loki via Grafana
|
|
95
|
-
|
|
96
|
-
### Health Checks
|
|
97
|
-
|
|
98
|
-
All services include health checks. Verify with:
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
docker-compose ps
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Next Steps
|
|
105
|
-
|
|
106
|
-
- Configure your API to use the DATABASE_URL and REDIS_URL
|
|
107
|
-
- Add OpenTelemetry SDK to your application
|
|
108
|
-
- Create custom Grafana dashboards for your API metrics
|
|
109
|
-
- Set up log forwarding to Loki
|
|
File without changes
|
|
File without changes
|