From 924a50cf70061b5aa688df961cd29defc8c8d53c Mon Sep 17 00:00:00 2001 From: Long1TaiL Date: Tue, 23 Jun 2026 21:41:35 +0300 Subject: [PATCH 1/3] lab 6: start submission --- submissions/lab6.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 submissions/lab6.md diff --git a/submissions/lab6.md b/submissions/lab6.md new file mode 100644 index 000000000..23aa36563 --- /dev/null +++ b/submissions/lab6.md @@ -0,0 +1 @@ +# Lab 6 submission \ No newline at end of file From 2a3b22aced8c5abf3c45c7e39f06bfb53ecd5542 Mon Sep 17 00:00:00 2001 From: Long1TaiL Date: Tue, 23 Jun 2026 22:37:25 +0300 Subject: [PATCH 2/3] lab 6: done --- app/Dockerfile | 24 ++++++ compose.yaml | 22 +++++ submissions/lab6.md | 200 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 app/Dockerfile create mode 100644 compose.yaml diff --git a/app/Dockerfile b/app/Dockerfile new file mode 100644 index 000000000..592659d75 --- /dev/null +++ b/app/Dockerfile @@ -0,0 +1,24 @@ +FROM golang:1.24.5-alpine AS builder + +WORKDIR /src + +COPY go.mod ./ +RUN go mod download + +COPY . . + +RUN CGO_ENABLED=0 go build \ + -trimpath \ + -ldflags="-s -w" \ + -o /quicknotes + +FROM gcr.io/distroless/static:nonroot + +COPY --from=builder /quicknotes /quicknotes +COPY --from=builder /src/seed.json /seed.json + +EXPOSE 8080 + +USER 65532:65532 + +ENTRYPOINT ["/quicknotes"] \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 000000000..495cbf9ae --- /dev/null +++ b/compose.yaml @@ -0,0 +1,22 @@ +services: + quicknotes: + image: quicknotes:lab6 + build: + context: ./app + user: "0:0" + + ports: + - "8080:8080" + + environment: + ADDR: ":8080" + DATA_PATH: "/data/notes.json" + SEED_PATH: "/seed.json" + + volumes: + - quicknotes-data:/data + + restart: unless-stopped + +volumes: + quicknotes-data: \ No newline at end of file diff --git a/submissions/lab6.md b/submissions/lab6.md index 23aa36563..7c808b111 100644 --- a/submissions/lab6.md +++ b/submissions/lab6.md @@ -1 +1,199 @@ -# Lab 6 submission \ No newline at end of file +# Lab 6 submission + +## `dockerfile`: + +``` +FROM golang:1.24.5-alpine AS builder + +WORKDIR /src + +COPY go.mod ./ +RUN go mod download + +COPY . . + +RUN CGO_ENABLED=0 go build \ + -trimpath \ + -ldflags="-s -w" \ + -o /quicknotes + +FROM gcr.io/distroless/static:nonroot + +COPY --from=builder /quicknotes /quicknotes +COPY --from=builder /src/seed.json /seed.json + +EXPOSE 8080 + +USER 65532:65532 + +ENTRYPOINT ["/quicknotes"] +``` + +### docker images quicknotes:lab6 + +``` +docker images quicknotes:lab6 + i Info → U In Use +IMAGE ID DISK USAGE CONTENT SIZE EXTRA +quicknotes:lab6 + 89c2136f5efc 14.7MB 3.32MB +``` + +### docker inspect quicknotes:lab6 | jq '.[0].Config' + +``` +docker inspect quicknotes:lab6 | jq '.[0].Config' +{ + "Entrypoint": [ + "/quicknotes" + ], + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" + ], + "ExposedPorts": { + "8080/tcp": {} + }, + "User": "65532:65532", + "WorkingDir": "/home/nonroot" +} +``` + +``` +golang:1.24.5-alpine daae04ebad0c 394MB 83.3MB +``` + +## `compose.yalm`: + +``` +services: + quicknotes: + image: quicknotes:lab6 + build: + context: ./app + user: "0:0" + + ports: + - "8080:8080" + + environment: + ADDR: ":8080" + DATA_PATH: "/data/notes.json" + SEED_PATH: "/seed.json" + + volumes: + - quicknotes-data:/data + + restart: unless-stopped + +volumes: + quicknotes-data: + +``` + +``` +long1tail@Long1Tail:~/DevOps-Intro $ docker compose up --build -d +sleep 3 +curl -X POST -H 'Content-Type: application/json' \ + -d '{"title":"durable","body":"survive a restart"}' \ + http://localhost:8080/notes +curl -s http://localhost:8080/notes | grep durable +WARN[0000] Docker Compose requires buildx plugin to be installed +Sending build context to Docker daemon 5.188MB +Step 1/13 : FROM golang:1.24.5-alpine AS builder + ---> daae04ebad0c +Step 2/13 : WORKDIR /src + ---> Using cache + ---> 799bad952f0f +Step 3/13 : COPY go.mod ./ + ---> Using cache + ---> 7c1c40614b4e +Step 4/13 : RUN go mod download + ---> Using cache + ---> 822599abaeef +Step 5/13 : COPY . . + ---> Using cache + ---> 3540ad3ee96b +Step 6/13 : RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /quicknotes + ---> Using cache + ---> dff8776b7cc1 +Step 7/13 : FROM gcr.io/distroless/static:nonroot + ---> 963fa6c544fe +Step 8/13 : COPY --from=builder /quicknotes /quicknotes + ---> Using cache + ---> 1efb8b2954ad +Step 9/13 : COPY --from=builder /src/seed.json /seed.json + ---> Using cache + ---> 701937b2d2a6 +Step 10/13 : EXPOSE 8080 + ---> Using cache + ---> dfb1476938e2 +Step 11/13 : USER 65532:65532 + ---> Using cache + ---> 6715c8119c21 +Step 12/13 : ENTRYPOINT ["/quicknotes"] + ---> Using cache + ---> 89c2136f5efc +Step 13/13 : LABEL com.docker.compose.image.builder=classic + ---> Using cache + ---> 57ea3a70d968 +Successfully built 57ea3a70d968 +Successfully tagged quicknotes:lab6 +[+] up 2/2 + ✔ Image quicknotes:lab6 Built 0.4s + ✔ Container devops-intro-quicknotes-1 Running 0.0s +{"id":5,"title":"durable","body":"survive a restart","created_at":"2026-06-23T19:29:07.590969929Z"} +[{"id":1,"title":"Welcome to QuickNotes","body":"This is the project you'll containerize, deploy, monitor, and harden across all 10 labs.","created_at":"2026-01-15T10:00:00Z"},{"id":2,"title":"Read app/main.go first","body":"Start by understanding the entry point — env vars, signal handling, graceful shutdown.","created_at":"2026-01-15T10:05:00Z"},{"id":3,"title":"DevOps mantra","body":"If it hurts, do it more often.","created_at":"2026-01-15T10:10:00Z"},{"id":4,"title":"Endpoint cheat-sheet","body":"GET /notes GET /notes/{id} POST /notes DELETE /notes/{id} GET /health GET /metrics","created_at":"2026-01-15T10:15:00Z"},{"id":5,"title":"durable","body":"survive a restart","created_at":"2026-06-23T19:29:07.590969929Z"}] +long1tail@Long1Tail:~/DevOps-Intro $ docker compose down +[+] down 2/2 + ✔ Container devops-intro-quicknotes-1 Removed 0.3s + ✔ Network devops-intro_default Removed 0.3s +long1tail@Long1Tail:~/DevOps-Intro $ docker compose up -d +sleep 3 +curl -s http://localhost:8080/notes | grep durable +[+] up 2/2 + ✔ Network devops-intro_default Created 0.1s + ✔ Container devops-intro-quicknotes-1 Started 0.2s +[{"id":2,"title":"Read app/main.go first","body":"Start by understanding the entry point — env vars, signal handling, graceful shutdown.","created_at":"2026-01-15T10:05:00Z"},{"id":3,"title":"DevOps mantra","body":"If it hurts, do it more often.","created_at":"2026-01-15T10:10:00Z"},{"id":4,"title":"Endpoint cheat-sheet","body":"GET /notes GET /notes/{id} POST /notes DELETE /notes/{id} GET /health GET /metrics","created_at":"2026-01-15T10:15:00Z"},{"id":5,"title":"durable","body":"survive a restart","created_at":"2026-06-23T19:29:07.590969929Z"},{"id":1,"title":"Welcome to QuickNotes","body":"This is the project you'll containerize, deploy, monitor, and harden across all 10 labs.","created_at":"2026-01-15T10:00:00Z"}] +long1tail@Long1Tail:~/DevOps-Intro $ docker compose down -v +[+] down 3/3 + ✔ Container devops-intro-quicknotes-1 Removed 0.3s + ✔ Volume devops-intro_quicknotes-data Removed 0.0s + ✔ Network devops-intro_default Removed 0.3s +long1tail@Long1Tail:~/DevOps-Intro $ docker compose up -d +sleep 3 +curl -s http://localhost:8080/notes | grep durable +[+] up 3/3 + ✔ Network devops-intro_default Created 0.0s + ✔ Volume devops-intro_quicknotes-data Created 0.0s + ✔ Container devops-intro-quicknotes-1 Started 0.1s + ``` + + ### a + + Docker caches layers. If you COPY . . before go mod download, any source code change invalidates the cache and forces dependencies to be downloaded again. Copying only go.mod and go.sum first lets Docker reuse the dependency layer, so rebuilding after a code change is much faster. + + ### b + + CGO_ENABLED=0 produces a fully static Go binary. Distroless static images do not include system libraries like glibc, so a CGO-enabled binary may fail to start because required shared libraries are missing. + + ### c + + It's a minimal runtime image containing only essentials like CA certificates and a non-root user. It does not include a shell, package manager, or common Linux utilities. Fewer installed packages mean a smaller attack surface and fewer CVEs. + + ### d + + -s -w removes symbol and debug information, reducing binary size at the cost of harder debugging. -trimpath removes local filesystem paths from the binary, improving reproducibility and avoiding leakage of build-machine details. + + ### e + + The best approach is to use functionality built into the application binary itself, for example a /healthz endpoint or a dedicated healthcheck command. This avoids adding extra tools and works naturally with distroless images. + + + ### f + + Because named volumes are managed separately from containers. docker compose down removes containers and networks, but keeps volumes. To delete the data, run docker compose down -v or remove the volume explicitly. + + ### g + + It only waits for the dependency container to start, not for the service inside it to become ready. This can cause race conditions where your app starts before the database is accepting connections and crashes on startup. \ No newline at end of file From 9b52d8883b21ddd3e5bb36c76fc53c0f603c5a8b Mon Sep 17 00:00:00 2001 From: long1tail Date: Wed, 1 Jul 2026 01:18:08 +0300 Subject: [PATCH 3/3] lab8: Done Signed-off-by: long1tail --- compose.yaml | 29 + docs/runbook/high-error-rate.md | 16 + .../provisioning/dashboards/dashboard.yml | 9 + .../provisioning/datasources/datasource.yml | 8 + monitoring/prometheus/prometheus.yml | 9 + submissions/image-1.png | Bin 0 -> 23265 bytes submissions/image.png | Bin 0 -> 42411 bytes submissions/lab6.md | 199 ------- submissions/lab8.md | 552 ++++++++++++++++++ 9 files changed, 623 insertions(+), 199 deletions(-) create mode 100644 docs/runbook/high-error-rate.md create mode 100644 monitoring/grafana/provisioning/dashboards/dashboard.yml create mode 100644 monitoring/grafana/provisioning/datasources/datasource.yml create mode 100644 monitoring/prometheus/prometheus.yml create mode 100644 submissions/image-1.png create mode 100644 submissions/image.png delete mode 100644 submissions/lab6.md create mode 100644 submissions/lab8.md diff --git a/compose.yaml b/compose.yaml index 495cbf9ae..b6352d463 100644 --- a/compose.yaml +++ b/compose.yaml @@ -17,6 +17,35 @@ services: - quicknotes-data:/data restart: unless-stopped + + + prometheus: + image: prom/prometheus:v3.3.1 + + ports: + - "9090:9090" + + volumes: + - ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro + + depends_on: + - quicknotes + grafana: + image: grafana/grafana:11.6.16 + + ports: + - "3000:3000" + + environment: + GF_SECURITY_ADMIN_USER: admin + GF_SECURITY_ADMIN_PASSWORD: supersecret123 + + volumes: + - ./monitoring/grafana/provisioning:/etc/grafana/provisioning + - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards + + depends_on: + - prometheus volumes: quicknotes-data: \ No newline at end of file diff --git a/docs/runbook/high-error-rate.md b/docs/runbook/high-error-rate.md new file mode 100644 index 000000000..a62e29642 --- /dev/null +++ b/docs/runbook/high-error-rate.md @@ -0,0 +1,16 @@ +# High Error Rate Alert + +## What this alert means +More than 5% of requests to QuickNotes are failing with HTTP 4xx or 5xx statuses over the last 5 minutes. + +## Triage steps +1. Check the Grafana dashboard → Errors panel to confirm the error ratio and see which endpoints are affected. +2. Look at the QuickNotes logs (`docker logs quicknotes`) for stack traces or specific error messages. +3. Verify the health of dependent services (database, external APIs) by checking their connectivity and response times. + +## Mitigations +- **Rollback** the latest deployment if a code change was recently pushed (revert to the previous image tag). +- **Increase logging** and enable debug mode to capture more details, then restart the service to clear any transient state. + +## Post-incident +After resolving, create a postmortem following the [template](https://github.com/your-repo/docs/postmortem-template.md) to document the root cause, impact, and action items. \ No newline at end of file diff --git a/monitoring/grafana/provisioning/dashboards/dashboard.yml b/monitoring/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 000000000..5c705b1ee --- /dev/null +++ b/monitoring/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,9 @@ +apiVersion: 1 + +providers: + - name: default + folder: "" + type: file + + options: + path: /var/lib/grafana/dashboards diff --git a/monitoring/grafana/provisioning/datasources/datasource.yml b/monitoring/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 000000000..86fd3465e --- /dev/null +++ b/monitoring/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,8 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + isDefault: true diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml new file mode 100644 index 000000000..f83efe3db --- /dev/null +++ b/monitoring/prometheus/prometheus.yml @@ -0,0 +1,9 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: quicknotes + + static_configs: + - targets: + - quicknotes:8080 diff --git a/submissions/image-1.png b/submissions/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbb02e2c7a60987299490e4e302b51d5bf5661f GIT binary patch literal 23265 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 MBMZZ~1}^vi15w?N!~g&Q literal 0 HcmV?d00001 diff --git a/submissions/lab6.md b/submissions/lab6.md deleted file mode 100644 index 7c808b111..000000000 --- a/submissions/lab6.md +++ /dev/null @@ -1,199 +0,0 @@ -# Lab 6 submission - -## `dockerfile`: - -``` -FROM golang:1.24.5-alpine AS builder - -WORKDIR /src - -COPY go.mod ./ -RUN go mod download - -COPY . . - -RUN CGO_ENABLED=0 go build \ - -trimpath \ - -ldflags="-s -w" \ - -o /quicknotes - -FROM gcr.io/distroless/static:nonroot - -COPY --from=builder /quicknotes /quicknotes -COPY --from=builder /src/seed.json /seed.json - -EXPOSE 8080 - -USER 65532:65532 - -ENTRYPOINT ["/quicknotes"] -``` - -### docker images quicknotes:lab6 - -``` -docker images quicknotes:lab6 - i Info → U In Use -IMAGE ID DISK USAGE CONTENT SIZE EXTRA -quicknotes:lab6 - 89c2136f5efc 14.7MB 3.32MB -``` - -### docker inspect quicknotes:lab6 | jq '.[0].Config' - -``` -docker inspect quicknotes:lab6 | jq '.[0].Config' -{ - "Entrypoint": [ - "/quicknotes" - ], - "Env": [ - "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" - ], - "ExposedPorts": { - "8080/tcp": {} - }, - "User": "65532:65532", - "WorkingDir": "/home/nonroot" -} -``` - -``` -golang:1.24.5-alpine daae04ebad0c 394MB 83.3MB -``` - -## `compose.yalm`: - -``` -services: - quicknotes: - image: quicknotes:lab6 - build: - context: ./app - user: "0:0" - - ports: - - "8080:8080" - - environment: - ADDR: ":8080" - DATA_PATH: "/data/notes.json" - SEED_PATH: "/seed.json" - - volumes: - - quicknotes-data:/data - - restart: unless-stopped - -volumes: - quicknotes-data: - -``` - -``` -long1tail@Long1Tail:~/DevOps-Intro $ docker compose up --build -d -sleep 3 -curl -X POST -H 'Content-Type: application/json' \ - -d '{"title":"durable","body":"survive a restart"}' \ - http://localhost:8080/notes -curl -s http://localhost:8080/notes | grep durable -WARN[0000] Docker Compose requires buildx plugin to be installed -Sending build context to Docker daemon 5.188MB -Step 1/13 : FROM golang:1.24.5-alpine AS builder - ---> daae04ebad0c -Step 2/13 : WORKDIR /src - ---> Using cache - ---> 799bad952f0f -Step 3/13 : COPY go.mod ./ - ---> Using cache - ---> 7c1c40614b4e -Step 4/13 : RUN go mod download - ---> Using cache - ---> 822599abaeef -Step 5/13 : COPY . . - ---> Using cache - ---> 3540ad3ee96b -Step 6/13 : RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /quicknotes - ---> Using cache - ---> dff8776b7cc1 -Step 7/13 : FROM gcr.io/distroless/static:nonroot - ---> 963fa6c544fe -Step 8/13 : COPY --from=builder /quicknotes /quicknotes - ---> Using cache - ---> 1efb8b2954ad -Step 9/13 : COPY --from=builder /src/seed.json /seed.json - ---> Using cache - ---> 701937b2d2a6 -Step 10/13 : EXPOSE 8080 - ---> Using cache - ---> dfb1476938e2 -Step 11/13 : USER 65532:65532 - ---> Using cache - ---> 6715c8119c21 -Step 12/13 : ENTRYPOINT ["/quicknotes"] - ---> Using cache - ---> 89c2136f5efc -Step 13/13 : LABEL com.docker.compose.image.builder=classic - ---> Using cache - ---> 57ea3a70d968 -Successfully built 57ea3a70d968 -Successfully tagged quicknotes:lab6 -[+] up 2/2 - ✔ Image quicknotes:lab6 Built 0.4s - ✔ Container devops-intro-quicknotes-1 Running 0.0s -{"id":5,"title":"durable","body":"survive a restart","created_at":"2026-06-23T19:29:07.590969929Z"} -[{"id":1,"title":"Welcome to QuickNotes","body":"This is the project you'll containerize, deploy, monitor, and harden across all 10 labs.","created_at":"2026-01-15T10:00:00Z"},{"id":2,"title":"Read app/main.go first","body":"Start by understanding the entry point — env vars, signal handling, graceful shutdown.","created_at":"2026-01-15T10:05:00Z"},{"id":3,"title":"DevOps mantra","body":"If it hurts, do it more often.","created_at":"2026-01-15T10:10:00Z"},{"id":4,"title":"Endpoint cheat-sheet","body":"GET /notes GET /notes/{id} POST /notes DELETE /notes/{id} GET /health GET /metrics","created_at":"2026-01-15T10:15:00Z"},{"id":5,"title":"durable","body":"survive a restart","created_at":"2026-06-23T19:29:07.590969929Z"}] -long1tail@Long1Tail:~/DevOps-Intro $ docker compose down -[+] down 2/2 - ✔ Container devops-intro-quicknotes-1 Removed 0.3s - ✔ Network devops-intro_default Removed 0.3s -long1tail@Long1Tail:~/DevOps-Intro $ docker compose up -d -sleep 3 -curl -s http://localhost:8080/notes | grep durable -[+] up 2/2 - ✔ Network devops-intro_default Created 0.1s - ✔ Container devops-intro-quicknotes-1 Started 0.2s -[{"id":2,"title":"Read app/main.go first","body":"Start by understanding the entry point — env vars, signal handling, graceful shutdown.","created_at":"2026-01-15T10:05:00Z"},{"id":3,"title":"DevOps mantra","body":"If it hurts, do it more often.","created_at":"2026-01-15T10:10:00Z"},{"id":4,"title":"Endpoint cheat-sheet","body":"GET /notes GET /notes/{id} POST /notes DELETE /notes/{id} GET /health GET /metrics","created_at":"2026-01-15T10:15:00Z"},{"id":5,"title":"durable","body":"survive a restart","created_at":"2026-06-23T19:29:07.590969929Z"},{"id":1,"title":"Welcome to QuickNotes","body":"This is the project you'll containerize, deploy, monitor, and harden across all 10 labs.","created_at":"2026-01-15T10:00:00Z"}] -long1tail@Long1Tail:~/DevOps-Intro $ docker compose down -v -[+] down 3/3 - ✔ Container devops-intro-quicknotes-1 Removed 0.3s - ✔ Volume devops-intro_quicknotes-data Removed 0.0s - ✔ Network devops-intro_default Removed 0.3s -long1tail@Long1Tail:~/DevOps-Intro $ docker compose up -d -sleep 3 -curl -s http://localhost:8080/notes | grep durable -[+] up 3/3 - ✔ Network devops-intro_default Created 0.0s - ✔ Volume devops-intro_quicknotes-data Created 0.0s - ✔ Container devops-intro-quicknotes-1 Started 0.1s - ``` - - ### a - - Docker caches layers. If you COPY . . before go mod download, any source code change invalidates the cache and forces dependencies to be downloaded again. Copying only go.mod and go.sum first lets Docker reuse the dependency layer, so rebuilding after a code change is much faster. - - ### b - - CGO_ENABLED=0 produces a fully static Go binary. Distroless static images do not include system libraries like glibc, so a CGO-enabled binary may fail to start because required shared libraries are missing. - - ### c - - It's a minimal runtime image containing only essentials like CA certificates and a non-root user. It does not include a shell, package manager, or common Linux utilities. Fewer installed packages mean a smaller attack surface and fewer CVEs. - - ### d - - -s -w removes symbol and debug information, reducing binary size at the cost of harder debugging. -trimpath removes local filesystem paths from the binary, improving reproducibility and avoiding leakage of build-machine details. - - ### e - - The best approach is to use functionality built into the application binary itself, for example a /healthz endpoint or a dedicated healthcheck command. This avoids adding extra tools and works naturally with distroless images. - - - ### f - - Because named volumes are managed separately from containers. docker compose down removes containers and networks, but keeps volumes. To delete the data, run docker compose down -v or remove the volume explicitly. - - ### g - - It only waits for the dependency container to start, not for the service inside it to become ready. This can cause race conditions where your app starts before the database is accepting connections and crashes on startup. \ No newline at end of file diff --git a/submissions/lab8.md b/submissions/lab8.md new file mode 100644 index 000000000..5cf32082a --- /dev/null +++ b/submissions/lab8.md @@ -0,0 +1,552 @@ +# Lab 8 submission + +`dashboard.yml` + +``` +apiVersion: 1 + +providers: + - name: default + folder: "" + type: file + + options: + path: /var/lib/grafana/dashboards +``` + +`datasource.yml` + +``` +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + isDefault: true +``` + +`prometeus.yml` + +``` +global: + scrape_interval: 15s + +scrape_configs: + - job_name: quicknotes + + static_configs: + - targets: + - quicknotes:8080 +``` + +`golden-signals` + +``` +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.16", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "rate(quicknotes_http_requests_total{instance=\"quicknotes:8080\"}[$__rate_interval])", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.16", + "targets": [ + { + "editorMode": "code", + "expr": "rate(quicknotes_http_requests_total[$__rate_interval])", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Traffic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.16", + "targets": [ + { + "editorMode": "code", + "expr": "quicknotes_notes_total", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Saturation", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.16", + "targets": [ + { + "editorMode": "code", + "expr": "sum(rate(quicknotes_http_responses_by_code_total{code=~\"[45]..\"}[$__rate_interval])) / sum(rate(quicknotes_http_requests_total[$__rate_interval]))", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Errors", + "type": "timeseries" + } + ], + "preload": false, + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "New dashboard", + "uid": "", + "version": 0 +} +``` +![alt text](image.png) + +``` +long1tail@JustSomeLaptop ~/DevOps-Intro (feature/lab8)> curl http://localhost:9090/api/v1/targets | jq '.data.activeTargets[].health' + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 612 100 612 0 0 544k 0 --:--:-- --:--:-- --:--:-- 597k +"up" +``` + +- a. Pull means Prometheus must be able to reach QuickNotes (the target must be network-reachable from Prometheus). If Prometheus can't reach QuickNotes, the scrape fails, up becomes 0, and you lose metrics until connectivity is restored. + +- b. Setting 5s creates excessive load on both systems and increases cardinality, while making queries slower; setting 5m reduces resolution, causing you to miss short-lived error spikes and making rate() calculations inaccurate. + +- c. rate() is the right choice for the Traffic panel because it computes the per‑second average increase over the chosen time window, smoothing out bursts and providing a stable view of request flow, unlike irate() which reacts too sharply to single spikes, and delta() which returns total count rather than a rate. + +- d. Provisioning from files ensures dashboards are version‑controlled, reproducible, and automatically applied on every fresh stack start, eliminating manual, error‑prone UI steps and keeping the setup consistent across environments. + + +``` +apiVersion: 1 +groups: + - orgId: 1 + name: main + folder: folder + interval: 1m + rules: + - uid: efqqj408ng0zke + title: Errors + condition: C + data: + - refId: A + relativeTimeRange: + from: 600 + to: 0 + datasourceUid: PBFA97CFB590B2093 + model: + editorMode: code + expr: (sum(rate(quicknotes_http_requests_total{code=~"4..|5.."}[5m])) / sum(rate(quicknotes_http_requests_total[5m]))) > 0.05 + instant: true + intervalMs: 1000 + legendFormat: __auto + maxDataPoints: 43200 + range: false + refId: A + - refId: C + datasourceUid: __expr__ + model: + conditions: + - evaluator: + params: + - 0.05 + type: gt + operator: + type: and + query: + params: + - C + reducer: + params: [] + type: last + type: query + datasource: + type: __expr__ + uid: __expr__ + expression: A + intervalMs: 1000 + maxDataPoints: 43200 + refId: C + type: threshold + noDataState: NoData + execErrState: Error + for: 1m + annotations: {} + labels: {} + isPaused: false + notification_settings: + receiver: grafana-default-email +``` + +![alt text](image-1.png) + +- e. A 5‑minute sustain period prevents false positives caused by transient glitches (e.g., a single misbehaving client, a momentary network hiccup). It confirms that the error condition is persistent and actually affecting users, not just a one‑off spike. + +- f. A cause alert might be: "Database connection pool usage > 90%". +It's worse because high pool usage doesn't necessarily mean users are seeing errors—the app might be handling the load gracefully. On‑call engineers would then have to correlate this metric with user‑visible symptoms. Symptom alerts (like error ratio) directly measure what users experience, so they are more actionable and reduce cognitive overhead during incidents. + +- g. A reasonable rule of thumb: if your alert pages the on‑call team more than 5% of the time when the user was not actually affected (i.e., false‑positive rate > 5%), it's too noisy. In practice, a healthy false‑positive rate should be < 1% to keep on‑call attention sharp and prevent pager fatigue. \ No newline at end of file