Skip to content

Commit 10a7198

Browse files
committed
docs: add v0.1.1 changelog and service mesh detector docs
1 parent 3752eaf commit 10a7198

3 files changed

Lines changed: 197 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.1.1] - 2026-02-11
11+
12+
### Added
13+
14+
- 6 service mesh detectors for linkerd and istio
15+
- LinkerdControlPlane: detects linkerd deployments with zero replicas (FATAL)
16+
- LinkerdProxyInjection: detects linkerd pods in CrashLoopBackOff (CRITICAL)
17+
- IstioControlPlane: detects istiod with zero replicas (FATAL)
18+
- IstioSidecarInjection: detects istio-system pods in CrashLoopBackOff (CRITICAL)
19+
- LinkerdCertExpiry: tiered alerts for identity cert expiry (<7d WARNING, <48h CRITICAL, <24h FATAL)
20+
- IstioCertExpiry: tiered alerts for root cert expiry (<7d WARNING, <48h CRITICAL, <24h FATAL)
21+
22+
### Changed
23+
24+
- Total detector count: 7 → 13
25+
- CLAUDE.md synced with global project standards
26+
- CONTRIBUTING.md commit message format aligned with conventional commits
27+
- ARCHITECTURE.md Go version corrected to 1.25+, stale timing fixed to 1 minute
28+
29+
### Fixed
30+
31+
- Duplicate `.PHONY: deps` in Makefile
32+
- Stale problem timing documented as 2 minutes but implemented as 1 minute
33+
1034
## [0.1.0] - 2026-02-08
1135

1236
### Added
@@ -27,5 +51,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2751
- Prometheus health monitoring with connection status in TUI header
2852
- Multi-platform builds via Makefile (Linux, macOS, Windows)
2953

30-
[Unreleased]: https://github.com/ppiankov/infranow/compare/v0.1.0...HEAD
54+
[Unreleased]: https://github.com/ppiankov/infranow/compare/v0.1.1...HEAD
55+
[0.1.1]: https://github.com/ppiankov/infranow/compare/v0.1.0...v0.1.1
3156
[0.1.0]: https://github.com/ppiankov/infranow/releases/tag/v0.1.0

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,12 @@ Problem score formula: `severity_weight * (1 + blast_radius * 0.1) * (1 + persis
209209

210210
## Roadmap
211211

212-
### v0.1.1
212+
### v0.1.1 (current)
213213

214214
- ~~Increase test coverage to >80% across all packages~~ (done)
215+
- ~~Service mesh detectors for linkerd and istio~~ (done: 6 detectors)
216+
- ~~Certificate expiry detection with tiered severity~~ (done)
215217
- Integration tests with docker-compose + Prometheus
216-
- Watcher goroutine orchestration tests
217218
- Config file support (YAML)
218219
- Custom detector thresholds via config
219220

docs/DETECTORS.md

Lines changed: 168 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,173 @@ kube_pod_status_phase{phase="Pending"} * on(namespace, pod) group_left() (time()
231231

232232
---
233233

234+
## Service Mesh Detectors
235+
236+
### LinkerdControlPlaneDetector
237+
238+
**Purpose**: Detects linkerd control plane deployments with zero available replicas. When the control plane is down, proxy injection fails, mTLS breaks, and traffic routing stops for all meshed services.
239+
240+
**Entity Type**: `service_mesh_control_plane`
241+
242+
**Query**:
243+
```promql
244+
kube_deployment_status_replicas_available{namespace="linkerd"} == 0
245+
```
246+
247+
**Severity**: `FATAL`
248+
249+
**Blast Radius**: 15 (affects all meshed services)
250+
251+
**Hint**: "Check pod status: kubectl get pods -n linkerd"
252+
253+
---
254+
255+
### LinkerdProxyInjectionDetector
256+
257+
**Purpose**: Detects linkerd pods in CrashLoopBackOff. Catches proxy-injector, identity, and destination service failures.
258+
259+
**Entity Type**: `service_mesh_control_plane`
260+
261+
**Query**:
262+
```promql
263+
kube_pod_container_status_waiting_reason{namespace="linkerd",reason="CrashLoopBackOff"} > 0
264+
```
265+
266+
**Severity**: `CRITICAL`
267+
268+
**Blast Radius**: 10
269+
270+
**Hint**: "Proxy injector or identity service failure"
271+
272+
---
273+
274+
### IstioControlPlaneDetector
275+
276+
**Purpose**: Detects istiod with zero available replicas. When istiod is down, xDS config distribution stops and new deployments break.
277+
278+
**Entity Type**: `service_mesh_control_plane`
279+
280+
**Query**:
281+
```promql
282+
kube_deployment_status_replicas_available{namespace="istio-system",deployment="istiod"} == 0
283+
```
284+
285+
**Severity**: `FATAL`
286+
287+
**Blast Radius**: 15
288+
289+
**Hint**: "Check pod status: kubectl get pods -n istio-system"
290+
291+
---
292+
293+
### IstioSidecarInjectionDetector
294+
295+
**Purpose**: Detects istio-system pods in CrashLoopBackOff. Catches istiod, gateway, and pilot failures.
296+
297+
**Entity Type**: `service_mesh_control_plane`
298+
299+
**Query**:
300+
```promql
301+
kube_pod_container_status_waiting_reason{namespace="istio-system",reason="CrashLoopBackOff"} > 0
302+
```
303+
304+
**Severity**: `CRITICAL`
305+
306+
**Blast Radius**: 10
307+
308+
**Hint**: "Sidecar injector or pilot failure"
309+
310+
---
311+
312+
## Service Mesh Certificate Detectors
313+
314+
### LinkerdCertExpiryDetector
315+
316+
**Purpose**: Detects linkerd identity certificates approaching expiry. Certificate expiry is the silent killer of service meshes — mTLS fails across all meshed services without warning.
317+
318+
**Entity Type**: `service_mesh_certificate`
319+
320+
**Query**:
321+
```promql
322+
(identity_cert_expiry_timestamp - time()) < 604800
323+
```
324+
325+
**Severity** (tiered):
326+
- `WARNING`: < 7 days remaining
327+
- `CRITICAL`: < 48 hours remaining
328+
- `FATAL`: < 24 hours remaining or expired
329+
330+
**Blast Radius**: 20 (highest — cert expiry kills the entire mesh)
331+
332+
**Interval**: 60s
333+
334+
**Hint**: "Rotate certs: linkerd check --proxy; Renew: linkerd upgrade | kubectl apply -f -"
335+
336+
---
337+
338+
### IstioCertExpiryDetector
339+
340+
**Purpose**: Detects istio root certificate approaching expiry. When the Citadel root cert expires, all workload certificates become invalid.
341+
342+
**Entity Type**: `service_mesh_certificate`
343+
344+
**Query**:
345+
```promql
346+
(citadel_server_root_cert_expiry_timestamp - time()) < 604800
347+
```
348+
349+
**Severity** (tiered):
350+
- `WARNING`: < 7 days remaining
351+
- `CRITICAL`: < 48 hours remaining
352+
- `FATAL`: < 24 hours remaining or expired
353+
354+
**Blast Radius**: 20
355+
356+
**Interval**: 60s
357+
358+
**Hint**: "Check status: istioctl proxy-status; Rotate: istioctl create-remote-secret"
359+
360+
---
361+
362+
### Certificate Monitoring Setup
363+
364+
Service mesh certificate metrics are **often missing from Prometheus**. This is the most common reason cert expiry goes undetected.
365+
366+
**Why cert metrics are missing**:
367+
- Linkerd identity service not in Prometheus scrape targets
368+
- Istiod metrics endpoint not scraped
369+
- cert-manager not exporting metrics
370+
- ServiceMonitor or PodMonitor CRDs missing
371+
372+
**How to verify**:
373+
```bash
374+
# Check if linkerd metrics are being scraped
375+
curl -s http://prometheus:9090/api/v1/targets | \
376+
jq '.data.activeTargets[] | select(.labels.job | contains("linkerd"))'
377+
378+
# Verify cert metric exists
379+
curl -s http://prometheus:9090/api/v1/query?query=identity_cert_expiry_timestamp
380+
curl -s http://prometheus:9090/api/v1/query?query=citadel_server_root_cert_expiry_timestamp
381+
```
382+
383+
**Required scrape targets**:
384+
- **Linkerd**: `linkerd-identity` (port 9990), `linkerd-proxy-injector` (port 9995)
385+
- **Istio**: `istiod` (port 15014)
386+
- **cert-manager** (optional): `certmanager_certificate_expiration_timestamp_seconds`
387+
388+
---
389+
390+
### Service Mesh Metric Requirements
391+
392+
| Metric | Source | Detector |
393+
|--------|--------|----------|
394+
| `kube_deployment_status_replicas_available` | kube-state-metrics | Control plane health |
395+
| `kube_pod_container_status_waiting_reason` | kube-state-metrics | Component crashes |
396+
| `identity_cert_expiry_timestamp` | linkerd-identity | Linkerd cert expiry |
397+
| `citadel_server_root_cert_expiry_timestamp` | istiod | Istio cert expiry |
398+
399+
---
400+
234401
## Adding Custom Detectors
235402

236403
To add a custom detector:
@@ -373,7 +540,7 @@ Post-MVP detector candidates:
373540
- **DatabaseReplicationLagDetector**: PostgreSQL/MySQL replication lag
374541
- **KafkaUnderReplicatedPartitionsDetector**: Kafka partition health
375542
- **RedisMemoryPressureDetector**: Redis memory usage
376-
- **CertificateExpirationDetector**: TLS certificate expiration
543+
- ~~**CertificateExpirationDetector**: TLS certificate expiration~~ (implemented in v0.1.1 as LinkerdCertExpiry + IstioCertExpiry)
377544
- **PVCFullDetector**: PersistentVolumeClaim usage
378545
- **NodeNotReadyDetector**: Kubernetes node health
379546
- **DeploymentReplicaMismatchDetector**: Desired vs actual replicas

0 commit comments

Comments
 (0)