# iam-veeramalla/observability-zero-to-hero architecture

> Architecture diagram of the GitHub repository iam-veeramalla/observability-zero-to-hero, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-05-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/iam-veeramalla/observability-zero-to-hero
- Repository: https://github.com/iam-veeramalla/observability-zero-to-hero

## Overview

1. This repository is a 7-part observability tutorial, not a single product. Each `day-*` folder is a mostly self-contained lab that adds one layer of the observability stack on top of Kubernetes.

2. The architectural center of the repo is Kubernetes. Almost every day introduces manifests or Helm values that deploy components into a cluster, so the diagram should show Kubernetes as the hosting boundary for the apps and observability services.

3. Days 1–3 focus on metrics. The stack is Prometheus for collection/storage, Grafana for visualization, and kube-prometheus-stack-style installation/configuration for cluster-level monitoring. Day 3 adds PromQL as the query layer over Prometheus data.

4. Day 4 adds application instrumentation. There are two Node.js services, `service-a` and `service-b`, each containerized with a Dockerfile and deployed via Kubernetes manifests. They export custom metrics via `prom-client`, and the services are the primary telemetry sources in this stage.

5. The Day 4 application flow is service-to-service: `service-a` and `service-b` are deployed separately and exposed with their own Kubernetes Services. This is also where the repo introduces Alertmanager, so the metrics flow becomes: app metrics → Prometheus → alert rules → Alertmanager → email notification config.

6. Day 5 introduces logging. The repo contains a log pipeline built around Fluent Bit, with Kubernetes configuration for collecting container logs from the cluster and forwarding them to a log backend. The folder naming and README imply an EFK-style pattern, while the included manifests suggest an OpenSearch/Fluent Bit deployment variant.

7. Day 6 introduces distributed tracing with Jaeger. The architecture adds trace generation from instrumented services and sends traces to Jaeger, which becomes the trace storage and UI layer. This is a separate telemetry plane from metrics and logs, but still deployed in Kubernetes via Helm values.

8. Day 7 is the most integrated setup. It contains two Go microservices, `microservice-a` and `microservice-b`, plus OpenTelemetry Collector configuration, Prometheus config, and Jaeger values. This is the unified observability stage where one app emits metrics and traces through OpenTelemetry-enabled pipelines.

9. The Day 7 data flow is the key architecture pattern for the repo: Go services → OpenTelemetry instrumentation/Collector → backends such as Prometheus for metrics and Jaeger for traces. The repo also includes Kubernetes manifests for the services, showing the separation between workload deployment and telemetry pipeline deployment.

10. The `opensearch-stack` directory is a standalone logging subsystem. It contains a Fluent Bit DaemonSet, Fluent Bit config, and a log generator, so it should be shown as an independent log-ingestion path that can run alongside the other observability components.

11. Cross-cutting infrastructure includes Docker for packaging the sample services, Helm values for installing observability operators/components, and Kustomize-style manifests for assembling Kubernetes resources. The repo’s structure is therefore “lab modules + runtime manifests,” not a monolithic application codebase.

12. If you draw one overall diagram, the main boundaries are: sample workloads on one side, Kubernetes as the orchestration layer in the middle, and observability backends on the other side. The telemetry streams split into three paths: metrics to Prometheus/Grafana/Alertmanager, logs to Fluent Bit plus a log store/UI, and traces to Jaeger or an OpenTelemetry-backed trace pipeline.

Main entry points: [`day-2/custom_kube_prometheus_stack.yml`](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml) (Prometheus), [`day-4/application/service-a/index.js`](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/application/service-a/index.js) (Service A), [`day-4/application/service-b/index.js`](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/application/service-b/index.js) (Service B), [`day-4/kubernetes-manifest/kustomization.yml`](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/kubernetes-manifest/kustomization.yml) (Day 4)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_labs["Lab modules"]
  node_repo["Repo<br/>tutorial suite"]
  node_day1["Day 1<br/>metrics intro<br/>[readme.md]"]
  node_day2["Day 2<br/>kube-prom stack"]
  node_day3["Day 3<br/>promql + ingress"]
  node_day4["Day 4<br/>apps + alerts<br/>[kustomization.yml]"]
  node_day5["Day 5<br/>logs pipeline"]
  node_day6["Day 6<br/>jaeger tracing<br/>[jaeger-values.yaml]"]
  node_day7["Day 7<br/>unified otel<br/>[README.md]"]
end

subgraph group_workloads["Sample workloads"]
  node_servicea["Service A<br/>node app<br/>[index.js]"]
  node_serviceb["Service B<br/>node app<br/>[index.js]"]
  node_microa["Micro A<br/>go service<br/>[main.go]"]
  node_microb["Micro B<br/>go service<br/>[main.go]"]
end

subgraph group_platform["Kubernetes platform"]
  node_kubernetes{{"Kubernetes<br/>cluster boundary"}}
end

subgraph group_metrics["Metrics plane"]
  node_prometheus[("Prometheus<br/>metrics store")]
  node_grafana["Grafana<br/>metrics UI"]
  node_promql["PromQL<br/>query language<br/>[readme.md]"]
  node_alertmanager["Alertmanager<br/>alert router"]
  node_email["Email config<br/>notification config<br/>[email-secrets.yml]"]
end

subgraph group_telemetry["Logs and traces"]
  node_opensearch[("OpenSearch stack<br/>log subsystem")]
  node_fluentbit["Fluent Bit<br/>log collector"]
  node_jaeger[("Jaeger<br/>trace backend<br/>[jaeger-values.yaml]")]
  node_otel["OpenTelemetry<br/>trace pipeline"]
end

node_repo -->|"contains"| node_day1
node_repo -->|"contains"| node_day2
node_repo -->|"contains"| node_day3
node_repo -->|"contains"| node_day4
node_repo -->|"contains"| node_day5
node_repo -->|"contains"| node_day6
node_repo -->|"contains"| node_day7
node_day1 -->|"introduces"| node_prometheus
node_day1 -->|"introduces"| node_grafana
node_day2 -->|"configures"| node_prometheus
node_day2 -->|"configures"| node_grafana
node_day3 -->|"adds"| node_promql
node_day3 -->|"deploys to"| node_kubernetes
node_day4 -->|"contains"| node_servicea
node_day4 -->|"contains"| node_serviceb
node_day4 -->|"adds"| node_alertmanager
node_day4 -->|"configures"| node_email
node_servicea -->|"deployed in"| node_kubernetes
node_serviceb -->|"deployed in"| node_kubernetes
node_servicea -->|"calls"| node_serviceb
node_serviceb -->|"calls"| node_servicea
node_servicea -->|"emits metrics"| node_prometheus
node_serviceb -->|"emits metrics"| node_prometheus
node_prometheus -->|"sends alerts"| node_alertmanager
node_day5 -->|"introduces"| node_fluentbit
node_fluentbit -->|"forwards logs"| node_opensearch
node_day6 -->|"introduces"| node_jaeger
node_servicea -.->|"exports traces"| node_jaeger
node_serviceb -.->|"exports traces"| node_jaeger
node_day7 -->|"introduces"| node_otel
node_day7 -->|"configures"| node_prometheus
node_day7 -->|"configures"| node_jaeger
node_microa -->|"deployed in"| node_kubernetes
node_microb -->|"deployed in"| node_kubernetes
node_microa -->|"calls"| node_microb
node_microb -->|"calls"| node_microa
node_microa -->|"exports telemetry"| node_otel
node_microb -->|"exports telemetry"| node_otel
node_otel -->|"feeds metrics"| node_prometheus
node_otel -->|"feeds traces"| node_jaeger
node_opensearch -->|"runs on"| node_kubernetes
node_fluentbit -->|"runs on"| node_kubernetes

click node_day1 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-1/readme.md"
click node_day2 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml"
click node_day3 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-3/ingress_kube_prom_stack.yaml"
click node_day4 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/kubernetes-manifest/kustomization.yml"
click node_day5 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-5/fluentbit-values.yaml"
click node_day6 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-6/jaeger-values.yaml"
click node_day7 "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/README.md"
click node_opensearch "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/opensearch-stack/fluent-bit-daemonset.yaml"
click node_prometheus "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml"
click node_grafana "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml"
click node_promql "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-3/readme.md"
click node_alertmanager "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/alerts-alertmanager-servicemonitor-manifest/alertmangerconfig.yml"
click node_email "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/alerts-alertmanager-servicemonitor-manifest/email-secrets.yml"
click node_fluentbit "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-5/fluentbit-values.yaml"
click node_jaeger "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-6/jaeger-values.yaml"
click node_otel "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/otel-collector-values.yaml"
click node_servicea "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/application/service-a/index.js"
click node_serviceb "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/application/service-b/index.js"
click node_microa "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/microservice-a/main.go"
click node_microb "https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/microservice-b/main.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_repo,node_day1,node_day2,node_day3,node_day4,node_day5,node_day6,node_day7 toneBlue
class node_servicea,node_serviceb,node_microa,node_microb toneAmber
class node_kubernetes toneMint
class node_prometheus,node_grafana,node_promql,node_alertmanager,node_email toneRose
class node_opensearch,node_fluentbit,node_jaeger,node_otel toneIndigo
```

## Components

### Lab modules

Tutorial days and standalone stack modules

- **Repo**: tutorial suite · Seven-part observability tutorial organized as self-contained lab days
- [Day 1](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-1/readme.md): metrics intro · First metrics lab introducing the basic observability setup · `day-1/readme.md`
- [Day 2](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml): kube-prom stack · Cluster monitoring installation and configuration using kube-prometheus-stack style values · `day-2/custom_kube_prometheus_stack.yml`
- [Day 3](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-3/ingress_kube_prom_stack.yaml): promql + ingress · Adds PromQL querying and cluster ingress based monitoring configuration · `day-3/ingress_kube_prom_stack.yaml`
- [Day 4](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/kubernetes-manifest/kustomization.yml): apps + alerts · Instrumented Node.js services plus alerting pipeline and Kubernetes manifests · `day-4/kubernetes-manifest/kustomization.yml`
- [Day 5](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-5/fluentbit-values.yaml): logs pipeline · Fluent Bit based logging stack for collecting and forwarding cluster logs · `day-5/fluentbit-values.yaml`
- [Day 6](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-6/jaeger-values.yaml): jaeger tracing · Tracing lab centered on Jaeger deployment values · `day-6/jaeger-values.yaml`
- [Day 7](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/README.md): unified otel · Integrated OpenTelemetry setup for metrics and traces with Go services · `day-7/README.md`

### Sample workloads

Application services used to generate telemetry

- [Service A](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/application/service-a/index.js): node app · Day 4 Node.js service exporting custom metrics and traces · `day-4/application/service-a/index.js`
- [Service B](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/application/service-b/index.js): node app · Day 4 Node.js service exporting custom metrics and traces · `day-4/application/service-b/index.js`
- [Micro A](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/microservice-a/main.go): go service · Day 7 Go microservice instrumented for metrics and traces · `day-7/microservice-a/main.go`
- [Micro B](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/microservice-b/main.go): go service · Day 7 Go microservice instrumented for metrics and traces · `day-7/microservice-b/main.go`

### Kubernetes platform

Cluster-level deployment and orchestration boundary

- **Kubernetes**: cluster boundary · Primary hosting boundary for workloads and observability components

### Metrics plane

Metrics collection, storage, querying, visualization, and alerts

- [Prometheus](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml): metrics store · Metrics scrape and storage backend · `day-2/custom_kube_prometheus_stack.yml`
- [Grafana](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-2/custom_kube_prometheus_stack.yml): metrics UI · Dashboard and visualization layer for metrics · `day-2/custom_kube_prometheus_stack.yml`
- [PromQL](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-3/readme.md): query language · Query layer used to analyze Prometheus data · `day-3/readme.md`
- [Alertmanager](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/alerts-alertmanager-servicemonitor-manifest/alertmangerconfig.yml): alert router · Routes alert rules to notification channels · `day-4/alerts-alertmanager-servicemonitor-manifest/alertmangerconfig.yml`
- [Email config](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-4/alerts-alertmanager-servicemonitor-manifest/email-secrets.yml): notification config · Email secrets and delivery settings for alerts · `day-4/alerts-alertmanager-servicemonitor-manifest/email-secrets.yml`

### Logs and traces

Logging and tracing backends and pipelines

- [OpenSearch stack](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/opensearch-stack/fluent-bit-daemonset.yaml): log subsystem · Standalone Fluent Bit and log generator stack for log ingestion and storage · `opensearch-stack/fluent-bit-daemonset.yaml`
- [Fluent Bit](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-5/fluentbit-values.yaml): log collector · DaemonSet-based log collection and forwarding agent · `day-5/fluentbit-values.yaml`
- [Jaeger](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-6/jaeger-values.yaml): trace backend · Trace storage and UI layer · `day-6/jaeger-values.yaml`
- [OpenTelemetry](https://github.com/iam-veeramalla/observability-zero-to-hero/blob/main/day-7/otel-collector-values.yaml): trace pipeline · Collector and instrumentation pipeline used in the integrated setup · `day-7/otel-collector-values.yaml`

## Connections

- Repo → Day 1: contains · Tutorial modules are organized by day
- Repo → Day 2: contains · Tutorial modules are organized by day
- Repo → Day 3: contains · Tutorial modules are organized by day
- Repo → Day 4: contains · Tutorial modules are organized by day
- Repo → Day 5: contains · Tutorial modules are organized by day
- Repo → Day 6: contains · Tutorial modules are organized by day
- Repo → Day 7: contains · Tutorial modules are organized by day
- Day 1 → Prometheus: introduces · Metrics collection and storage
- Day 1 → Grafana: introduces · Metrics visualization
- Day 2 → Prometheus: configures · kube-prometheus-stack style setup
- Day 2 → Grafana: configures · Dashboard stack values
- Day 3 → PromQL: adds · Query layer for Prometheus data
- Day 3 → Kubernetes: deploys to · Ingress and monitoring stack run in cluster
- Day 4 → Service A: contains · Containerized Node.js workload
- Day 4 → Service B: contains · Containerized Node.js workload
- Day 4 → Alertmanager: adds · Alerting pipeline
- Day 4 → Email config: configures · Alert delivery settings
- Service A → Kubernetes: deployed in · Workload manifests place service A in the cluster
- Service B → Kubernetes: deployed in · Workload manifests place service B in the cluster
- Service A → Service B: calls · Service-to-service flow
- Service B → Service A: calls · Service-to-service flow
- Service A → Prometheus: emits metrics · Custom metrics are scraped from the app
- Service B → Prometheus: emits metrics · Custom metrics are scraped from the app
- Prometheus → Alertmanager: sends alerts · Alert rules route firing alerts onward
- Day 5 → Fluent Bit: introduces · Cluster log collection pipeline
- Fluent Bit → OpenSearch stack: forwards logs · Logs are shipped to a log backend
- Day 6 → Jaeger: introduces · Tracing backend and UI
- Service A → Jaeger: exports traces · Instrumented service sends traces
- Service B → Jaeger: exports traces · Instrumented service sends traces
- Day 7 → OpenTelemetry: introduces · Collector and instrumentation pipeline
- Day 7 → Prometheus: configures · Metrics backend values for unified setup
- Day 7 → Jaeger: configures · Trace backend values for unified setup
- Micro A → Kubernetes: deployed in · Go service manifests run in cluster
- Micro B → Kubernetes: deployed in · Go service manifests run in cluster
- Micro A → Micro B: calls · Microservice interaction path
- Micro B → Micro A: calls · Microservice interaction path
- Micro A → OpenTelemetry: exports telemetry · Unified metrics and traces path
- Micro B → OpenTelemetry: exports telemetry · Unified metrics and traces path
- OpenTelemetry → Prometheus: feeds metrics · Collector routes metrics to Prometheus
- OpenTelemetry → Jaeger: feeds traces · Collector routes traces to Jaeger
- OpenSearch stack → Kubernetes: runs on · Standalone logging subsystem can coexist in cluster
- Fluent Bit → Kubernetes: runs on · DaemonSet collects container logs from cluster nodes
