From 94d1a32d35e637f35ea8d72b678262e98f9058ae Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 10:28:06 -0500 Subject: [PATCH 1/7] Update index.ts added prometheus code --- kubernetes-ts-guestbook/simple/index.ts | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/kubernetes-ts-guestbook/simple/index.ts b/kubernetes-ts-guestbook/simple/index.ts index 048eaab53..f3746a299 100644 --- a/kubernetes-ts-guestbook/simple/index.ts +++ b/kubernetes-ts-guestbook/simple/index.ts @@ -8,10 +8,43 @@ import * as pulumi from "@pulumi/pulumi"; const config = new pulumi.Config(); const isMinikube = config.getBoolean("isMinikube"); +const monitoringNs = new k8s.core.v1.Namespace("monitoring", { + metadata: { + name: "monitoring", + }, +}); + + +const prometheus = new k8s.helm.v3.Chart("prometheus", { + + chart: "kube-prometheus-stack", + + fetchOpts: { + repo: "https://prometheus-community.github.io/helm-charts", + }, + + namespace: monitoringNs.metadata.name, + + values: { + grafana: { + enabled: false, + }, + + prometheus: { + prometheusSpec: { + serviceMonitorSelectorNilUsesHelmValues: false, + }, + }, + }, +}); + + // // REDIS LEADER. // +PROVIDER_DOCKER_VERSION_EXIT_1 + const redisLeaderLabels = { app: "redis-leader" }; const redisLeaderDeployment = new k8s.apps.v1.Deployment("redis-leader", { spec: { From 58b7d5eb69932844b8f192d4b89032c7f32e5d66 Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 11:49:53 -0500 Subject: [PATCH 2/7] Update index.ts remove typo --- kubernetes-ts-guestbook/simple/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/kubernetes-ts-guestbook/simple/index.ts b/kubernetes-ts-guestbook/simple/index.ts index f3746a299..d415e63f4 100644 --- a/kubernetes-ts-guestbook/simple/index.ts +++ b/kubernetes-ts-guestbook/simple/index.ts @@ -43,8 +43,6 @@ const prometheus = new k8s.helm.v3.Chart("prometheus", { // REDIS LEADER. // -PROVIDER_DOCKER_VERSION_EXIT_1 - const redisLeaderLabels = { app: "redis-leader" }; const redisLeaderDeployment = new k8s.apps.v1.Deployment("redis-leader", { spec: { From 150ed4cd8697267012490fbe3dacfb0a6787e77c Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 11:55:56 -0500 Subject: [PATCH 3/7] Update index.ts added grafana implementation --- kubernetes-ts-guestbook/simple/index.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/kubernetes-ts-guestbook/simple/index.ts b/kubernetes-ts-guestbook/simple/index.ts index d415e63f4..f79aee188 100644 --- a/kubernetes-ts-guestbook/simple/index.ts +++ b/kubernetes-ts-guestbook/simple/index.ts @@ -14,6 +14,7 @@ const monitoringNs = new k8s.core.v1.Namespace("monitoring", { }, }); +// Prometheus initialization const prometheus = new k8s.helm.v3.Chart("prometheus", { @@ -38,6 +39,30 @@ const prometheus = new k8s.helm.v3.Chart("prometheus", { }, }); +// Grafana implementation + +const grafana = new k8s.helm.v3.Chart("grafana", { + + chart: "grafana", + + fetchOpts: { + repo: "https://grafana.github.io/helm-charts", + }, + + namespace: monitoringNs.metadata.name, + + values: { + + adminUser: "admin", + adminPassword: "admin123", + + service: { + type: "NodePort", + nodePort: 32000, + }, + }, +}); + // // REDIS LEADER. From eeb9a88bd65a2166ad2bad99b33e566079b3287c Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 12:07:51 -0500 Subject: [PATCH 4/7] Update index.ts added prometheus annotations --- kubernetes-ts-guestbook/simple/index.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/kubernetes-ts-guestbook/simple/index.ts b/kubernetes-ts-guestbook/simple/index.ts index f79aee188..ab929bd01 100644 --- a/kubernetes-ts-guestbook/simple/index.ts +++ b/kubernetes-ts-guestbook/simple/index.ts @@ -141,11 +141,20 @@ const redisReplicaService = new k8s.core.v1.Service("redis-replica", { const frontendLabels = { app: "frontend" }; const frontendDeployment = new k8s.apps.v1.Deployment("frontend", { - spec: { - selector: { matchLabels: frontendLabels }, - replicas: 3, - template: { - metadata: { labels: frontendLabels }, + spec: { + selector: { matchLabels: frontendLabels }, + replicas: 3, + template: { + metadata: { + + labels: frontendLabels, + + annotations: { + "prometheus.io/scrape": "true", + "prometheus.io/port": "80", + "prometheus.io/path": "/metrics", + }, + }, spec: { containers: [ { From a3cc9c277283ffa8e211fb5e2656529d92a5129a Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 12:10:27 -0500 Subject: [PATCH 5/7] Update index.ts add service monitor --- kubernetes-ts-guestbook/simple/index.ts | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/kubernetes-ts-guestbook/simple/index.ts b/kubernetes-ts-guestbook/simple/index.ts index ab929bd01..44c59f550 100644 --- a/kubernetes-ts-guestbook/simple/index.ts +++ b/kubernetes-ts-guestbook/simple/index.ts @@ -63,6 +63,41 @@ const grafana = new k8s.helm.v3.Chart("grafana", { }, }); +// Grafana Monitor Service + +const serviceMonitor = new k8s.apiextensions.CustomResource("guestbook-monitor", { + + apiVersion: "monitoring.coreos.com/v1", + + kind: "ServiceMonitor", + + metadata: { + name: "guestbook-monitor", + namespace: "monitoring", + }, + + spec: { + + selector: { + matchLabels: { + app: "frontend", + }, + }, + + namespaceSelector: { + any: true, + }, + + endpoints: [ + { + port: "http", + path: "/metrics", + interval: "15s", + }, + ], + }, +}); + // // REDIS LEADER. From e641fd937e76a05800a41b170f9d8a150a0fe1c6 Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 12:13:31 -0500 Subject: [PATCH 6/7] Added pulumi vars Added pulumi vars and exported --- kubernetes-ts-guestbook/simple/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kubernetes-ts-guestbook/simple/index.ts b/kubernetes-ts-guestbook/simple/index.ts index 44c59f550..f6ee81a13 100644 --- a/kubernetes-ts-guestbook/simple/index.ts +++ b/kubernetes-ts-guestbook/simple/index.ts @@ -225,3 +225,11 @@ if (isMinikube) { } else { frontendIp = frontendService.status.loadBalancer.ingress[0].ip; } + + +// Add pulumi vars +export const grafanaUrl = "http://localhost:32000"; + +export const grafanaUser = "admin"; + +export const grafanaPassword = "admin123"; From 852f42c1a7b6fe1484207a854cd4b9be3a2a6628 Mon Sep 17 00:00:00 2001 From: Kandaswamyvidya Date: Thu, 28 May 2026 12:58:10 -0500 Subject: [PATCH 7/7] Instructions to onboard Prometheus and Grafana Added the Instructions to onboard Prometheus and Grafana --- kubernetes-ts-guestbook/simple/Readme.md | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 kubernetes-ts-guestbook/simple/Readme.md diff --git a/kubernetes-ts-guestbook/simple/Readme.md b/kubernetes-ts-guestbook/simple/Readme.md new file mode 100644 index 000000000..592deec85 --- /dev/null +++ b/kubernetes-ts-guestbook/simple/Readme.md @@ -0,0 +1,31 @@ +# Guestbook Monitoring Assignment + +## Features +- Pulumi deployment +- Prometheus monitoring +- Grafana dashboards +- ServiceMonitor +- Guestbook metrics + +## Deployment + +npm install +pulumi up + +## Grafana + +URL: +http://localhost:32000 + +Username: +admin + +Password: +admin123 + +## Verify Metrics + +kubectl port-forward svc/prometheus-operated 9090 -n monitoring + +Open: +http://localhost:9090/targets