{"id":17779509,"url":"https://github.com/rudikone/spring-boot-otel-tracing-example","last_synced_at":"2025-08-12T16:32:44.007Z","repository":{"id":259595406,"uuid":"874839321","full_name":"rudikone/spring-boot-otel-tracing-example","owner":"rudikone","description":"Пример использования трейсинга OpenTelemetry в Spring Boot приложении","archived":false,"fork":false,"pushed_at":"2025-06-04T13:50:34.000Z","size":898,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-04T20:55:33.908Z","etag":null,"topics":["jaeger","kafka","micrometer","opentelemetry","sleuth","spring-boot","spring-kafka","tracing"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rudikone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-18T14:54:59.000Z","updated_at":"2025-04-03T06:38:50.000Z","dependencies_parsed_at":"2024-10-26T20:00:20.822Z","dependency_job_id":"bfdec2c9-713c-4b89-b482-fe761e7ebc5f","html_url":"https://github.com/rudikone/spring-boot-otel-tracing-example","commit_stats":{"total_commits":7,"total_committers":2,"mean_commits":3.5,"dds":0.1428571428571429,"last_synced_commit":"16da1880034343ed1f386fd79317a7d534253a39"},"previous_names":["rudikone/spring-boot-otel-tracing-example"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rudikone/spring-boot-otel-tracing-example","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudikone%2Fspring-boot-otel-tracing-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudikone%2Fspring-boot-otel-tracing-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudikone%2Fspring-boot-otel-tracing-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudikone%2Fspring-boot-otel-tracing-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rudikone","download_url":"https://codeload.github.com/rudikone/spring-boot-otel-tracing-example/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rudikone%2Fspring-boot-otel-tracing-example/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270097172,"owners_count":24526624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"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":["jaeger","kafka","micrometer","opentelemetry","sleuth","spring-boot","spring-kafka","tracing"],"created_at":"2024-10-27T01:04:25.083Z","updated_at":"2025-08-12T16:32:43.970Z","avatar_url":"https://github.com/rudikone.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spring Boot OpenTelemetry example\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"front.png\" width=\"85%\"/\u003e\n\u003c/p\u003e\n\nПример использования трейсинга [OpenTelemetry](https://opentelemetry.io/docs/concepts/signals/traces/) в Spring Boot приложении.\n\nРеализации для Spring Boot 2 и Spring Boot 3 **_различаются_** и находятся в соответствующих ветках.\n\n## Описание\n\nOpenTelemetry - это целый набор практик и инструментов, определяющих, какие сигналы может генерировать приложение для взаимодействия с внешним миром, а также как эти сигналы можно собирать и визуализировать для наблюдения за состоянием приложений и системы в целом. Три основных типа сигналов: трассировка, логирование и сбор метрик.\n\n### Контексты\nOpenTelemetry вводит понятие контекста операции. Контекст в первую очередь включает в себя атрибуты trace_id (идентификатор текущей операции) и span_id (идентификатор подзапроса, при ретраях каждый подзапрос, например, должен иметь уникальный span_id). Кроме того, контекст может содержать статическую информацию, такую как название ноды, на которой развернуто приложение, или название окружения (prod/qa). Такие поля в терминологии OpenTelemetry называются resource и прикрепляются к каждому логу, метрике или трассировке для более удобного поиска. Дополнительно в контексте могут содержаться динамические данные, например, идентификатор текущего эндпоинта (\"http_path\": \"GET /user/:id/info\"), которые могут быть выборочно прикреплены к группе логов, метрик или трассировок. [**_W3C Trace Context_**](https://www.w3.org/TR/trace-context/) - объединяет в себе практики различных подходов и является стандартным в OpenTelemetry.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"spans.png\" width=\"65%\"/\u003e\n\u003c/p\u003e\n\n### Sampling\nВ высоконагруженных системах трафик выгружаемых логов и трейсов может достигать огромных значений, требуя невероятных расходов на инфраструктуру и хранение данных. Для решения этой проблемы стандарты OpenTelemetry включают в себя возможность семплирования сигналов – возможность выгружать не все трейсы и логи, а только их часть.\nДля решения этой проблемы механизмы распространения контекста OpenTelemetry передают флаг семплирования вместе с trace_id/span_id. Это необходимо для того, чтобы, если сервис, первый принявший запрос от пользователя, решит, что запрос должен быть выгружен подробно, все остальные системы также должны следовать этому решению и также выгружать данные подробно. В противном случае все системы должны выгружать сигналы частично или не выгружать вовсе, чтобы сэкономить ресурсы. Такой подход называется \"Head Sampling\" - решение принимается в начале обработки запроса случайно или на основе каких-то входных атрибутов.\nКроме этого, OpenTelemetry поддерживает режим \"Tail Sampling\", при котором все приложения всегда выгружают все сигналы подробно, но существует некоторый промежуточный буфер. После получения всех данных этот буфер принимает решение о том, стоит ли сохранить данные полностью или оставить лишь частичную выборку.\n\n### Baggage\nМеханизм Baggage позволяет вместе с trace_id/span_id передавать произвольный набор пар ключ-значение, который автоматически будет передаваться между всеми микросервисами по ходу обработки запроса. Этот механизм полезен для передачи дополнительной информации, которая необходима на протяжении всего пути запроса – например, для передачи информации о пользователе или настройках среды выполнения.\nПример заголовка для передачи baggage по стандарту w3c - `tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE,userId=1c30032h5`\n\n### Процесс\n\nИспользуйте OpenTelemetry SDK, созданный для языка, на котором вы работаете, чтобы внедрить трассировку в ваш код.\nOpenTelemetry отправляет собранные данные в любой бэкэнд (Jaeger, Zipkin и т. д.) для дальнейшего анализа и визуализации. Настройка OpenTelemetry для экспорта трасс начинается с написания конфигураций для сбора и экспорта данных в OpenTelemetry Collector\n\n**OpenTelemetry Collector** является частью конвейера сбора данных, который получает телеметрические данные и отправляет их на любой настроенный бэкэнд.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"pipeline.png\" width=\"65%\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"pipeline2.png\" width=\"65%\"/\u003e\n\u003c/p\u003e\n\n\n## Полезные ссылки\n\n- https://habr.com/ru/companies/oleg-bunin/articles/865690/\n- https://edgedelta.com/company/blog/what-is-opentelemetry-tracing\n- https://reflectoring.io/spring-boot-tracing/\n- https://piotrminkowski.com/2023/11/15/kafka-tracing-with-spring-boot-and-open-telemetry/\n- https://github.com/ThomasVitale/spring-boot-opentelemetry\n- https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/instrumentation\n- https://habr.com/ru/companies/flant/articles/892784/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frudikone%2Fspring-boot-otel-tracing-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frudikone%2Fspring-boot-otel-tracing-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frudikone%2Fspring-boot-otel-tracing-example/lists"}