{"id":50360348,"url":"https://github.com/arun0009/pulse","last_synced_at":"2026-05-30T01:05:27.492Z","repository":{"id":352343781,"uuid":"1214746874","full_name":"arun0009/pulse","owner":"arun0009","description":"Batteries-included Spring Boot observability starter. Cardinality firewall, timeout-budget propagation, SLO-as-code, async context, PII masking, error fingerprints - one dependency, zero agents","archived":false,"fork":false,"pushed_at":"2026-05-15T23:13:42.000Z","size":2461,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T01:58:50.843Z","etag":null,"topics":["cardinality","distributed-tracing","micrometer","observability","opentelemetry","slo","spring-boot-starter","sre","structured-logging"],"latest_commit_sha":null,"homepage":"https://arun0009.github.io/pulse/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arun0009.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-19T01:51:31.000Z","updated_at":"2026-05-15T23:13:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/arun0009/pulse","commit_stats":null,"previous_names":["arun0009/pulse"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/arun0009/pulse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arun0009%2Fpulse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arun0009%2Fpulse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arun0009%2Fpulse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arun0009%2Fpulse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arun0009","download_url":"https://codeload.github.com/arun0009/pulse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arun0009%2Fpulse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33676196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cardinality","distributed-tracing","micrometer","observability","opentelemetry","slo","spring-boot-starter","sre","structured-logging"],"created_at":"2026-05-30T01:05:26.752Z","updated_at":"2026-05-30T01:05:27.486Z","avatar_url":"https://github.com/arun0009.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"assets/pulse-logo.svg\" alt=\"Pulse logo\" width=\"128\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003ePulse\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003cstrong\u003eBatteries-included production observability for Spring Boot.\u003c/strong\u003e\u003cbr/\u003e\n\tOne dependency. Zero agents—Micrometer-native, OTLP-friendly. Everything your default stack quietly forgets.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://github.com/arun0009/pulse/actions/workflows/maven.yml\"\u003e\u003cimg alt=\"Build\" src=\"https://github.com/arun0009/pulse/actions/workflows/maven.yml/badge.svg?branch=main\"/\u003e\u003c/a\u003e\n\t\u003ca href=\"https://central.sonatype.com/artifact/io.github.arun0009/pulse-spring-boot-starter\"\u003e\u003cimg alt=\"Maven Central\" src=\"https://img.shields.io/maven-central/v/io.github.arun0009/pulse-spring-boot-starter?color=blue\"/\u003e\u003c/a\u003e\n\t\u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\"/\u003e\u003c/a\u003e\n\t\u003cimg alt=\"Java 21+\" src=\"https://img.shields.io/badge/Java-21%2B-blue?logo=openjdk\u0026logoColor=white\"/\u003e\n\t\u003cimg alt=\"Spring Boot 4\" src=\"https://img.shields.io/badge/Spring%20Boot-4-6DB33F?logo=springboot\u0026logoColor=white\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"https://arun0009.github.io/pulse/\"\u003e\u003cstrong\u003eDocumentation\u003c/strong\u003e\u003c/a\u003e\n\t\u0026nbsp;·\u0026nbsp;\n\t\u003ca href=\"#quick-start\"\u003eQuick start\u003c/a\u003e\n\t\u0026nbsp;·\u0026nbsp;\n\t\u003ca href=\"#six-reasons-to-install-pulse-on-day-one\"\u003eFeatures\u003c/a\u003e\n\t\u0026nbsp;·\u0026nbsp;\n\t\u003ca href=\"CHANGELOG.md\"\u003eChangelog\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## What is Pulse?\n\nOne Spring Boot starter that adds the production observability the default\nstack assumes you'll bolt on yourself: **a cardinality firewall so one bad\ntag can't 100× your metrics bill, timeout-budget propagation so no service\nin the chain works on a stale deadline, context that survives `@Async` /\n`@Scheduled` / Kafka, structured logs with deploy / commit / Kubernetes /\ncloud region stamped on every line, and stable exception fingerprints so\nthe same bug groups across deploys.**\n\nBelow the fold sits another layer for teams running distributed systems at\nscale — dependency health map, retry-amplification detection, request\ncriticality, fleet config-drift, container-aware memory, Kafka time-based\nlag, multi-tenant context, SLO-as-code, OpenFeature correlation, N+1\ndetection, Resilience4j auto-instrumentation, and more. **Every feature is\ndocumented in detail at \u003chttps://arun0009.github.io/pulse/\u003e.**\n\nNo agent. No bytecode weaving. No custom runtime. One dependency.\n\n## Quick start\n\n```xml\n\u003cdependency\u003e\n\t\u003cgroupId\u003eio.github.arun0009\u003c/groupId\u003e\n\t\u003cartifactId\u003epulse-spring-boot-starter\u003c/artifactId\u003e\n\t\u003cversion\u003e2.0.1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n```bash\nexport OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318\n./mvnw spring-boot:run\ncurl -s localhost:8080/actuator/health/otelExporter\n# {\"status\":\"UP\",\"details\":{\"lastSuccessAgeMs\":1230,\"totalSuccess\":14}}\n```\n\nThat's it. For a browser-friendly view of every Pulse subsystem (what's on,\nwhat's off, which configuration won) hit **`/actuator/pulseui`**.\n\nDon't have a Collector yet? `docker compose -f deploy/local-stack/docker-compose.yml up -d`\nbrings up the full pipeline in one command.\n\n→ Full guide: [arun0009.github.io/pulse/quickstart/](https://arun0009.github.io/pulse/quickstart/)\n\n## Six reasons to install Pulse on day one\n\nThe boring, unglamorous things that decide whether observability actually\nworks at 3 AM. Every one is on by default, none costs more than a\nnanosecond on the hot path, and none ships in Spring Boot or the OTel\nagent.\n\n| Driver | What it does | Read more |\n|---|---|---|\n| **Cardinality firewall** | Hard cap per `(meter, tag)` with overflow bucket and one-time WARN. ~17 ns/op cached. | [features/cardinality-firewall](https://arun0009.github.io/pulse/features/cardinality-firewall/) |\n| **Timeout-budget propagation** | Deadline travels with the request — across `RestTemplate`, `RestClient`, `WebClient`, `OkHttp`, Apache HttpClient 5, Kafka. | [features/timeout-budget](https://arun0009.github.io/pulse/features/timeout-budget/) |\n| **Context across `@Async` / `@Scheduled` / Kafka** | Every `TaskExecutor` and `TaskScheduler` is wrapped automatically. No `MDC` ritual. | [features/context-propagation](https://arun0009.github.io/pulse/features/context-propagation/) |\n| **Trace-context guard** | `pulse.trace.received` vs `pulse.trace.missing` per route, with shipped alert. Find the upstream stripping `traceparent`. | [features/trace-context-guard](https://arun0009.github.io/pulse/features/trace-context-guard/) |\n| **Structured logs (OTel-aligned)** | OTel-semconv JSON on every line — deploy / commit / pod / cloud region stamped automatically. PII masking on by default. | [features/structured-logs](https://arun0009.github.io/pulse/features/structured-logs/) |\n| **Stable exception fingerprints** | SHA-256 over `(type + top frames)` so the same bug groups across deploys. On the response, the active span, and a metric. | [features/exception-fingerprints](https://arun0009.github.io/pulse/features/exception-fingerprints/) |\n\n## Also included (19 more subsystems)\n\nEach is enabled by default, opt-out via `pulse.\u003csubsystem\u003e.enabled=false`,\nand documented in detail with config keys, metrics emitted, and runbook\nlinks at [arun0009.github.io/pulse/features/](https://arun0009.github.io/pulse/features/):\n\n- **Distributed-systems extras** — [Dependency health map](https://arun0009.github.io/pulse/features/dependencies/),\n\t[Retry amplification](https://arun0009.github.io/pulse/features/retry-amplification/),\n\t[Multi-tenant context](https://arun0009.github.io/pulse/features/multi-tenant/),\n\t[Request priority](https://arun0009.github.io/pulse/features/priority/),\n\t[Container-aware memory](https://arun0009.github.io/pulse/features/container-memory/),\n\t[Kafka time-based lag](https://arun0009.github.io/pulse/features/kafka-time-lag/),\n\t[Request fan-out](https://arun0009.github.io/pulse/features/fan-out/).\n- **Spring extras** — [SLO-as-code](https://arun0009.github.io/pulse/features/slo-as-code/),\n\t[Resilience4j auto-instrumentation](https://arun0009.github.io/pulse/features/resilience4j/),\n\t[Background-job observability](https://arun0009.github.io/pulse/features/jobs/),\n\t[Database (N+1, slow query)](https://arun0009.github.io/pulse/features/database/),\n\t[Cache (Caffeine)](https://arun0009.github.io/pulse/features/cache/),\n\t[OpenFeature correlation](https://arun0009.github.io/pulse/features/openfeature/),\n\t[Continuous-profiling correlation](https://arun0009.github.io/pulse/features/profiling/),\n\t[Wide-event API](https://arun0009.github.io/pulse/features/wide-events/),\n\t[Graceful drain + OTel flush](https://arun0009.github.io/pulse/features/graceful-shutdown/),\n\t[Fleet config-drift](https://arun0009.github.io/pulse/features/fleet-config-drift/),\n\t[Live diagnostic actuator](https://arun0009.github.io/pulse/features/actuator/),\n\t[Sampling](https://arun0009.github.io/pulse/features/sampling/).\n\n## How Pulse compares\n\n| Capability | Pulse | Spring Boot defaults | OTel Java agent | Vendor agents |\n|---|:---:|:---:|:---:|:---:|\n| Drop-in starter, no agent / no weaving | **yes** | yes | no | no |\n| Cardinality firewall | **yes** | no | no | no |\n| Timeout-budget propagation | **yes** | no | no | no |\n| Auto context across `@Async` / `@Scheduled` / Kafka | **yes** | partial | partial | partial |\n| Trace propagation guard + metric | **yes** | no | no | no |\n| Stable error fingerprints | **yes** | no | no | yes |\n| SLO-as-code with PrometheusRule generation | **yes** | no | no | no |\n| Live diagnostic actuator UI | **yes** | partial | no | proprietary |\n| Pre-built Grafana dashboard + alerts + runbooks | **yes** | no | no | proprietary |\n| Vendor lock-in | **none** | none | none | full |\n\n## Measured overhead\n\nEvery guardrail is JMH-benchmarked so the cost is provable:\n\n| Operation | Latency |\n|---|---|\n| `CardinalityFirewall.map` — cached value, hot path | **~17 ns/op** |\n| `SpanEvents.emit(name)` — counter on, log off | ~25 ns/op |\n\n\u003csup\u003eJDK 21, Apple M-series. Reproduce with `make bench`. Full table in the\ndocs.\u003c/sup\u003e\n\n## Compatibility\n\n| Component | Supported |\n|---|---|\n| Java | 21, 25 (CI runs both) |\n| Spring Boot | 4.0+ |\n| Logging | Log4j2 by default; Logback supported via opt-in |\n| GraalVM native | Reflection / proxy / resource hints registered (best-effort) |\n\n## Build quality\n\n- **Error Prone + NullAway** — null-safety via JSpecify `@NullMarked`\n- **Spotless** — auto-formatted on every build\n- **JaCoCo gate** — coverage floor enforced; merged unit + integration report\n- **CodeQL** — security scanning on every PR and weekly schedule\n- **CycloneDX SBOM** — supply-chain audit artifact on every build\n- **Sigstore signing** — keyless provenance on every release artifact via GitHub OIDC\n- **JMH benchmarks** — overhead claims are falsifiable; run in CI on every PR (non-blocking) and on demand via `make bench`\n- **Multi-JDK CI** — tested on Java 21 and 25\n- **Reproducible builds** — `project.build.outputTimestamp` set; bytewise-identical artifacts across rebuilds\n\n## Status \u0026 community\n\n**2.0** on Maven Central. See:\n\n- [Full documentation](https://arun0009.github.io/pulse/)\n- [`CHANGELOG.md`](CHANGELOG.md) — what's in each release\n- [`CONTRIBUTING.md`](CONTRIBUTING.md) — local workflow\n- [`SECURITY.md`](SECURITY.md) — vulnerability reporting\n- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) — community expectations\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farun0009%2Fpulse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farun0009%2Fpulse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farun0009%2Fpulse/lists"}