container-superposition 0.1.1
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 +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"runServices": ["prometheus"],
|
|
4
|
+
"_serviceOrder": 1,
|
|
5
|
+
"forwardPorts": [9090],
|
|
6
|
+
"portsAttributes": {
|
|
7
|
+
"9090": {
|
|
8
|
+
"label": "Prometheus",
|
|
9
|
+
"onAutoForward": "openBrowser"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
prometheus:
|
|
4
|
+
image: prom/prometheus:${PROMETHEUS_VERSION:-latest}
|
|
5
|
+
command:
|
|
6
|
+
- '--config.file=/etc/prometheus/prometheus.yml'
|
|
7
|
+
- '--storage.tsdb.path=/prometheus'
|
|
8
|
+
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
|
|
9
|
+
- '--web.console.templates=/usr/share/prometheus/consoles'
|
|
10
|
+
volumes:
|
|
11
|
+
- ./prometheus-prometheus.yml:/etc/prometheus/prometheus.yml
|
|
12
|
+
- prometheus_data:/prometheus
|
|
13
|
+
ports:
|
|
14
|
+
- '${PROMETHEUS_PORT:-9090}:9090'
|
|
15
|
+
networks:
|
|
16
|
+
- devnet
|
|
17
|
+
|
|
18
|
+
volumes:
|
|
19
|
+
prometheus_data:
|
|
20
|
+
|
|
21
|
+
networks:
|
|
22
|
+
devnet:
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
id: prometheus
|
|
2
|
+
name: Prometheus
|
|
3
|
+
description: Metrics collection and monitoring
|
|
4
|
+
category: observability
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires: []
|
|
8
|
+
suggests:
|
|
9
|
+
- alertmanager
|
|
10
|
+
conflicts: []
|
|
11
|
+
tags:
|
|
12
|
+
- observability
|
|
13
|
+
- metrics
|
|
14
|
+
- prometheus
|
|
15
|
+
ports:
|
|
16
|
+
- 9090
|
|
17
|
+
order: 1
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Verification script for Prometheus overlay
|
|
3
|
+
# Confirms Prometheus service is accessible
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
echo "🔍 Verifying Prometheus overlay..."
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
# Check if Prometheus service is running
|
|
11
|
+
echo "1️⃣ Checking Prometheus service..."
|
|
12
|
+
# Wait up to 15 seconds for prometheus to be ready
|
|
13
|
+
PROMETHEUS_READY=false
|
|
14
|
+
for i in {1..15}; do
|
|
15
|
+
if curl -sf http://prometheus:9090/-/healthy &> /dev/null; then
|
|
16
|
+
echo " ✅ Prometheus service is ready"
|
|
17
|
+
curl -s http://prometheus:9090/-/healthy
|
|
18
|
+
PROMETHEUS_READY=true
|
|
19
|
+
break
|
|
20
|
+
fi
|
|
21
|
+
sleep 1
|
|
22
|
+
done
|
|
23
|
+
|
|
24
|
+
if [ "$PROMETHEUS_READY" = false ]; then
|
|
25
|
+
echo " ❌ Prometheus service not ready after 15 seconds"
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
echo ""
|
|
30
|
+
echo "2️⃣ Checking Prometheus version..."
|
|
31
|
+
echo " Prometheus is accessible at http://prometheus:9090"
|
|
32
|
+
|
|
33
|
+
echo ""
|
|
34
|
+
echo "✅ Prometheus overlay verification complete"
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# Promtail Overlay
|
|
2
|
+
|
|
3
|
+
Log shipping agent that collects container logs and sends them to Loki for centralized log aggregation.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Promtail agent** - Grafana's official log shipping agent
|
|
8
|
+
- **Docker auto-discovery** - Automatically discovers and tails all container logs
|
|
9
|
+
- **Label extraction** - Extracts service names, container names, and custom labels
|
|
10
|
+
- **JSON parsing** - Automatically parses structured logs
|
|
11
|
+
- **Zero configuration** - Works out-of-box with minimal setup
|
|
12
|
+
- **Loki integration** - Ships logs directly to Loki
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
Promtail is a log shipping agent designed to collect logs from various sources and send them to Loki. In this overlay, Promtail monitors Docker containers and automatically ships their logs to Loki.
|
|
17
|
+
|
|
18
|
+
**Architecture:**
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
graph TD
|
|
22
|
+
A[Docker Containers<br/>Application logs<br/>Service logs<br/>System logs] -->|Docker socket| B[Promtail<br/>Discovers containers<br/>Tails log files<br/>Parses JSON logs<br/>Adds labels<br/>Buffers & batches]
|
|
23
|
+
B -->|HTTP Push| C[Loki<br/>Indexes labels<br/>Stores log data<br/>Serves queries]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**What It Does:**
|
|
27
|
+
|
|
28
|
+
1. **Discovers Containers:** Uses Docker service discovery to find running containers
|
|
29
|
+
2. **Extracts Metadata:** Pulls container name, image, compose service, and project labels
|
|
30
|
+
3. **Tails Logs:** Streams logs from `/var/lib/docker/containers/`
|
|
31
|
+
4. **Parses Content:** Attempts JSON parsing for structured logs
|
|
32
|
+
5. **Ships to Loki:** Sends logs with rich labels to Loki for storage and querying
|
|
33
|
+
|
|
34
|
+
## Configuration
|
|
35
|
+
|
|
36
|
+
### Docker Socket Access
|
|
37
|
+
|
|
38
|
+
Promtail requires access to:
|
|
39
|
+
|
|
40
|
+
- **Docker socket** (`/var/run/docker.sock`) - For service discovery
|
|
41
|
+
- **Container logs** (`/var/lib/docker/containers`) - For reading log files
|
|
42
|
+
|
|
43
|
+
Both are mounted read-only for security.
|
|
44
|
+
|
|
45
|
+
### Environment Variables
|
|
46
|
+
|
|
47
|
+
The overlay includes a `.env.example` file. Copy it to `.env` and customize:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd .devcontainer
|
|
51
|
+
cp .env.example .env
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Available variables:**
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Promtail version
|
|
58
|
+
PROMTAIL_VERSION=latest
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Label Extraction
|
|
62
|
+
|
|
63
|
+
Promtail automatically extracts these labels from containers:
|
|
64
|
+
|
|
65
|
+
| Label | Source | Example |
|
|
66
|
+
| ----------- | ---------------- | ---------------- |
|
|
67
|
+
| `container` | Container name | `my-app-1` |
|
|
68
|
+
| `image` | Container image | `node:18-alpine` |
|
|
69
|
+
| `service` | Compose service | `api` |
|
|
70
|
+
| `project` | Compose project | `my-project` |
|
|
71
|
+
| `job` | Fixed value | `docker` |
|
|
72
|
+
| `level` | Parsed from JSON | `info`, `error` |
|
|
73
|
+
|
|
74
|
+
### Customizing Configuration
|
|
75
|
+
|
|
76
|
+
Edit `promtail-config.yaml` in `.devcontainer/`:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
# Add custom pipeline stages
|
|
80
|
+
pipeline_stages:
|
|
81
|
+
- match:
|
|
82
|
+
selector: '{service="api"}'
|
|
83
|
+
stages:
|
|
84
|
+
- regex:
|
|
85
|
+
expression: '(?P<timestamp>\S+) (?P<level>\S+) (?P<message>.*)'
|
|
86
|
+
- labels:
|
|
87
|
+
level:
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Common Commands
|
|
91
|
+
|
|
92
|
+
### Viewing Logs in Grafana
|
|
93
|
+
|
|
94
|
+
**Simple queries:**
|
|
95
|
+
|
|
96
|
+
```logql
|
|
97
|
+
# All logs from a specific service
|
|
98
|
+
{service="api"}
|
|
99
|
+
|
|
100
|
+
# Logs from a specific container
|
|
101
|
+
{container="my-app-1"}
|
|
102
|
+
|
|
103
|
+
# Error logs only
|
|
104
|
+
{level="error"}
|
|
105
|
+
|
|
106
|
+
# Logs from a specific image
|
|
107
|
+
{image=~"node:.*"}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Advanced queries:**
|
|
111
|
+
|
|
112
|
+
```logql
|
|
113
|
+
# Rate of errors per minute
|
|
114
|
+
rate({level="error"}[1m])
|
|
115
|
+
|
|
116
|
+
# Logs containing specific text
|
|
117
|
+
{service="api"} |= "database connection"
|
|
118
|
+
|
|
119
|
+
# JSON field filtering
|
|
120
|
+
{service="api"} | json | userId="12345"
|
|
121
|
+
|
|
122
|
+
# Count logs by service
|
|
123
|
+
sum by(service) (count_over_time({job="docker"}[5m]))
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Checking Promtail Status
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Check if Promtail is running
|
|
130
|
+
docker ps | grep promtail
|
|
131
|
+
|
|
132
|
+
# View Promtail logs
|
|
133
|
+
docker logs promtail
|
|
134
|
+
|
|
135
|
+
# Check Promtail metrics (from inside dev container)
|
|
136
|
+
curl http://promtail:9080/metrics
|
|
137
|
+
|
|
138
|
+
# See which targets are being scraped
|
|
139
|
+
curl http://promtail:9080/targets
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Testing Log Collection
|
|
143
|
+
|
|
144
|
+
**Generate test logs:**
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# Run a test container with logs
|
|
148
|
+
docker run --rm alpine sh -c "echo 'Test log message'"
|
|
149
|
+
|
|
150
|
+
# View in Grafana within seconds:
|
|
151
|
+
# {container="alpine"} |= "Test log"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Verify logs are reaching Loki:**
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Check Loki ingestion
|
|
158
|
+
curl "http://loki:3100/loki/api/v1/query" \
|
|
159
|
+
--data-urlencode 'query={job="docker"}' \
|
|
160
|
+
--data-urlencode 'limit=10'
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Use Cases
|
|
164
|
+
|
|
165
|
+
- **Centralized logging** - Aggregate logs from all containers in one place
|
|
166
|
+
- **Debugging** - Track application behavior across services
|
|
167
|
+
- **Monitoring** - Alert on error patterns in logs
|
|
168
|
+
- **Audit trails** - Maintain searchable log history
|
|
169
|
+
- **Development** - Real-time log streaming during development
|
|
170
|
+
|
|
171
|
+
**Integrates well with:**
|
|
172
|
+
|
|
173
|
+
- Loki (required) - Log storage and querying
|
|
174
|
+
- Grafana (recommended) - Log visualization and exploration
|
|
175
|
+
- Prometheus (optional) - Correlate metrics with logs
|
|
176
|
+
- Tempo/Jaeger (optional) - Correlate traces with logs
|
|
177
|
+
|
|
178
|
+
## Log Format Support
|
|
179
|
+
|
|
180
|
+
### JSON Logs
|
|
181
|
+
|
|
182
|
+
**Application logging (Node.js):**
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
const logger = require('pino')();
|
|
186
|
+
|
|
187
|
+
logger.info({ userId: '123', action: 'login' }, 'User logged in');
|
|
188
|
+
// Promtail extracts: level=info, userId=123
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Application logging (Python):**
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
import logging
|
|
195
|
+
import json
|
|
196
|
+
|
|
197
|
+
logger = logging.getLogger(__name__)
|
|
198
|
+
logger.info(json.dumps({"userId": "123", "action": "login"}))
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Plain Text Logs
|
|
202
|
+
|
|
203
|
+
**Standard output:**
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
echo "2024-01-15 10:30:00 INFO User logged in"
|
|
207
|
+
# Promtail ships as-is with container labels
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Custom Parsing
|
|
211
|
+
|
|
212
|
+
Add regex patterns in `promtail-config.yaml`:
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
pipeline_stages:
|
|
216
|
+
- regex:
|
|
217
|
+
expression: '^(?P<timestamp>\S+) (?P<level>\S+) (?P<message>.*)$'
|
|
218
|
+
- labels:
|
|
219
|
+
level:
|
|
220
|
+
- timestamp:
|
|
221
|
+
source: timestamp
|
|
222
|
+
format: '2006-01-02 15:04:05'
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Troubleshooting
|
|
226
|
+
|
|
227
|
+
### Issue: No Logs Appearing
|
|
228
|
+
|
|
229
|
+
**Symptoms:**
|
|
230
|
+
|
|
231
|
+
- Promtail running but logs not in Loki
|
|
232
|
+
|
|
233
|
+
**Solutions:**
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Check Promtail can access Docker socket
|
|
237
|
+
docker exec promtail ls -la /var/run/docker.sock
|
|
238
|
+
|
|
239
|
+
# Check Promtail is discovering containers
|
|
240
|
+
docker logs promtail | grep "discovered targets"
|
|
241
|
+
|
|
242
|
+
# Verify Loki is reachable
|
|
243
|
+
docker exec promtail wget -O- http://loki:3100/ready
|
|
244
|
+
|
|
245
|
+
# Check Promtail positions file
|
|
246
|
+
docker exec promtail cat /tmp/positions.yaml
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Issue: "Permission Denied" on Docker Socket
|
|
250
|
+
|
|
251
|
+
**Symptoms:**
|
|
252
|
+
|
|
253
|
+
- Promtail logs show permission errors
|
|
254
|
+
|
|
255
|
+
**Solution:**
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
# Update docker-compose.yml to add Promtail to docker group
|
|
259
|
+
services:
|
|
260
|
+
promtail:
|
|
261
|
+
user: '0:0' # Run as root (development only)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
⚠️ **Security Note:** Running as root is acceptable for development but not for production.
|
|
265
|
+
|
|
266
|
+
### Issue: High Memory Usage
|
|
267
|
+
|
|
268
|
+
**Symptoms:**
|
|
269
|
+
|
|
270
|
+
- Promtail consuming excessive memory
|
|
271
|
+
|
|
272
|
+
**Solutions:**
|
|
273
|
+
|
|
274
|
+
```yaml
|
|
275
|
+
# Reduce batch size in promtail-config.yaml
|
|
276
|
+
clients:
|
|
277
|
+
- url: http://loki:3100/loki/api/v1/push
|
|
278
|
+
batchwait: 1s
|
|
279
|
+
batchsize: 102400 # Reduce from default 1MB
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Issue: Logs Not Parsed as JSON
|
|
283
|
+
|
|
284
|
+
**Symptoms:**
|
|
285
|
+
|
|
286
|
+
- JSON logs appear as plain text in Loki
|
|
287
|
+
|
|
288
|
+
**Solution:**
|
|
289
|
+
|
|
290
|
+
- Ensure application logs to stdout in JSON format
|
|
291
|
+
- Check `pipeline_stages` includes `json` stage
|
|
292
|
+
- Some apps need explicit JSON logging configuration
|
|
293
|
+
|
|
294
|
+
## Security Considerations
|
|
295
|
+
|
|
296
|
+
⚠️ **Docker Socket Access:** Promtail has read access to the Docker socket, which allows it to discover containers and read logs.
|
|
297
|
+
|
|
298
|
+
**Risks:**
|
|
299
|
+
|
|
300
|
+
- Read access to all container logs (may contain sensitive data)
|
|
301
|
+
- Docker API access (read-only)
|
|
302
|
+
|
|
303
|
+
**Mitigation:**
|
|
304
|
+
|
|
305
|
+
- Mounted as read-only (`:ro`)
|
|
306
|
+
- Development environment only
|
|
307
|
+
- Filter sensitive fields in pipeline stages:
|
|
308
|
+
|
|
309
|
+
```yaml
|
|
310
|
+
pipeline_stages:
|
|
311
|
+
- replace:
|
|
312
|
+
expression: 'password=\S+'
|
|
313
|
+
replace: 'password=***'
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Performance Tuning
|
|
317
|
+
|
|
318
|
+
**For high-volume logging:**
|
|
319
|
+
|
|
320
|
+
```yaml
|
|
321
|
+
# promtail-config.yaml
|
|
322
|
+
clients:
|
|
323
|
+
- url: http://loki:3100/loki/api/v1/push
|
|
324
|
+
batchwait: 500ms # Batch more frequently
|
|
325
|
+
batchsize: 1048576 # Larger batches
|
|
326
|
+
max_backoff: 5m # Retry backoff
|
|
327
|
+
max_retries: 10 # Retry attempts
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
**Limit log collection:**
|
|
331
|
+
|
|
332
|
+
```yaml
|
|
333
|
+
# Only collect logs from specific services
|
|
334
|
+
scrape_configs:
|
|
335
|
+
- job_name: docker
|
|
336
|
+
docker_sd_configs:
|
|
337
|
+
- host: unix:///var/run/docker.sock
|
|
338
|
+
relabel_configs:
|
|
339
|
+
# Drop logs from monitoring containers
|
|
340
|
+
- source_labels: ['__meta_docker_container_label_com_docker_compose_service']
|
|
341
|
+
regex: '(promtail|loki|prometheus)'
|
|
342
|
+
action: drop
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## References
|
|
346
|
+
|
|
347
|
+
- [Official Promtail Documentation](https://grafana.com/docs/loki/latest/clients/promtail/)
|
|
348
|
+
- [Promtail Configuration](https://grafana.com/docs/loki/latest/clients/promtail/configuration/)
|
|
349
|
+
- [LogQL Query Language](https://grafana.com/docs/loki/latest/logql/)
|
|
350
|
+
- [Docker Service Discovery](https://grafana.com/docs/loki/latest/clients/promtail/configuration/#docker_sd_configs)
|
|
351
|
+
|
|
352
|
+
**Related Overlays:**
|
|
353
|
+
|
|
354
|
+
- `loki` - Required log storage backend
|
|
355
|
+
- `grafana` - Recommended for log visualization
|
|
356
|
+
- `prometheus` - Optional for metrics correlation
|
|
357
|
+
- `tempo` - Optional for trace-log correlation
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
promtail:
|
|
4
|
+
image: grafana/promtail:${PROMTAIL_VERSION:-latest}
|
|
5
|
+
command: -config.file=/etc/promtail/promtail-config.yaml
|
|
6
|
+
volumes:
|
|
7
|
+
- ./promtail-config-promtail.yaml:/etc/promtail/promtail-config.yaml
|
|
8
|
+
- /var/lib/docker/containers:/var/lib/docker/containers:ro
|
|
9
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
10
|
+
depends_on:
|
|
11
|
+
- loki
|
|
12
|
+
networks:
|
|
13
|
+
- devnet
|
|
14
|
+
|
|
15
|
+
networks:
|
|
16
|
+
devnet:
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
id: promtail
|
|
2
|
+
name: Promtail
|
|
3
|
+
description: Log shipping agent for Loki with Docker auto-discovery
|
|
4
|
+
category: observability
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires:
|
|
8
|
+
- loki
|
|
9
|
+
suggests: []
|
|
10
|
+
conflicts: []
|
|
11
|
+
tags:
|
|
12
|
+
- observability
|
|
13
|
+
- logs
|
|
14
|
+
- promtail
|
|
15
|
+
- loki
|
|
16
|
+
ports: []
|
|
17
|
+
order: 2
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
server:
|
|
2
|
+
http_listen_port: 9080
|
|
3
|
+
grpc_listen_port: 0
|
|
4
|
+
|
|
5
|
+
positions:
|
|
6
|
+
filename: /tmp/positions.yaml
|
|
7
|
+
|
|
8
|
+
clients:
|
|
9
|
+
- url: http://loki:3100/loki/api/v1/push
|
|
10
|
+
|
|
11
|
+
scrape_configs:
|
|
12
|
+
# Docker container logs auto-discovery
|
|
13
|
+
- job_name: docker
|
|
14
|
+
docker_sd_configs:
|
|
15
|
+
- host: unix:///var/run/docker.sock
|
|
16
|
+
refresh_interval: 5s
|
|
17
|
+
|
|
18
|
+
relabel_configs:
|
|
19
|
+
# Extract container name
|
|
20
|
+
- source_labels: ['__meta_docker_container_name']
|
|
21
|
+
regex: '/(.*)'
|
|
22
|
+
target_label: 'container'
|
|
23
|
+
|
|
24
|
+
# Extract container image
|
|
25
|
+
- source_labels: ['__meta_docker_container_image']
|
|
26
|
+
target_label: 'image'
|
|
27
|
+
|
|
28
|
+
# Extract compose service name
|
|
29
|
+
- source_labels: ['__meta_docker_container_label_com_docker_compose_service']
|
|
30
|
+
target_label: 'service'
|
|
31
|
+
|
|
32
|
+
# Extract compose project
|
|
33
|
+
- source_labels: ['__meta_docker_container_label_com_docker_compose_project']
|
|
34
|
+
target_label: 'project'
|
|
35
|
+
|
|
36
|
+
# Add job label
|
|
37
|
+
- replacement: 'docker'
|
|
38
|
+
target_label: 'job'
|
|
39
|
+
|
|
40
|
+
pipeline_stages:
|
|
41
|
+
# Docker logs are wrapped in JSON: {log, stream, time}
|
|
42
|
+
# First parse the Docker wrapper
|
|
43
|
+
- docker: {}
|
|
44
|
+
|
|
45
|
+
# Then parse application JSON from the log field
|
|
46
|
+
- json:
|
|
47
|
+
expressions:
|
|
48
|
+
level: level
|
|
49
|
+
msg: message
|
|
50
|
+
trace_id: trace.id
|
|
51
|
+
span_id: span.id
|
|
52
|
+
|
|
53
|
+
# Extract log level as label
|
|
54
|
+
- labels:
|
|
55
|
+
level:
|
|
56
|
+
|
|
57
|
+
# Use Docker's timestamp
|
|
58
|
+
- timestamp:
|
|
59
|
+
source: timestamp
|
|
60
|
+
format: RFC3339Nano
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Promtail verification script
|
|
3
|
+
|
|
4
|
+
echo "🔍 Verifying Promtail installation..."
|
|
5
|
+
|
|
6
|
+
# Track overall success
|
|
7
|
+
ALL_CHECKS_PASSED=true
|
|
8
|
+
|
|
9
|
+
# Check if Promtail service is running
|
|
10
|
+
if docker ps --format '{{.Names}}' | grep -q promtail; then
|
|
11
|
+
echo "✓ Promtail service is running"
|
|
12
|
+
else
|
|
13
|
+
echo "✗ Promtail service is not running"
|
|
14
|
+
ALL_CHECKS_PASSED=false
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
# Check if Promtail can access Docker socket
|
|
18
|
+
if docker exec promtail test -S /var/run/docker.sock 2>/dev/null; then
|
|
19
|
+
echo "✓ Promtail has access to Docker socket"
|
|
20
|
+
else
|
|
21
|
+
echo "⚠️ Promtail cannot access Docker socket"
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Final result
|
|
25
|
+
if [ "$ALL_CHECKS_PASSED" = true ]; then
|
|
26
|
+
echo "✓ All critical checks passed"
|
|
27
|
+
exit 0
|
|
28
|
+
else
|
|
29
|
+
echo "✗ Some checks failed"
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|