{"id":13830304,"url":"https://github.com/remychantenay/slog-otel","last_synced_at":"2025-04-05T13:05:48.888Z","repository":{"id":194132332,"uuid":"690163330","full_name":"remychantenay/slog-otel","owner":"remychantenay","description":"Go slog's Handler implementation to ensure correlation with Open-Telemetry spans.","archived":false,"fork":false,"pushed_at":"2025-02-09T17:06:29.000Z","size":40,"stargazers_count":123,"open_issues_count":0,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T12:05:29.398Z","etag":null,"topics":["golang","logging","open-telemetry","otel","slog","tracing"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/remychantenay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-11T16:48:19.000Z","updated_at":"2025-02-27T16:16:47.000Z","dependencies_parsed_at":"2023-09-12T01:32:39.100Z","dependency_job_id":"9f52a472-d9ca-4cd0-99ae-d0545d9381cf","html_url":"https://github.com/remychantenay/slog-otel","commit_stats":null,"previous_names":["remychantenay/slog-otel"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remychantenay%2Fslog-otel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remychantenay%2Fslog-otel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remychantenay%2Fslog-otel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remychantenay%2Fslog-otel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remychantenay","download_url":"https://codeload.github.com/remychantenay/slog-otel/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247339155,"owners_count":20923014,"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","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":["golang","logging","open-telemetry","otel","slog","tracing"],"created_at":"2024-08-04T10:00:58.459Z","updated_at":"2025-04-05T13:05:48.871Z","avatar_url":"https://github.com/remychantenay.png","language":"Go","funding_links":[],"categories":["Enrichment"],"sub_categories":[],"readme":"# slog-otel\n[![Go Report Card](https://goreportcard.com/badge/github.com/remychantenay/slog-otel)](https://goreportcard.com/report/github.com/remychantenay/slog-otel)\n[![codebeat badge](https://codebeat.co/badges/33ebce8f-9681-4c9c-8c43-f9ab4f197d9e)](https://codebeat.co/projects/github-com-remychantenay-slog-otel-main)\n[![GoDoc](https://godoc.org/github.com/remychantenay/slog-otel?status.svg)](https://godoc.org/github.com/remychantenay/slog-otel)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\nGo package that provides an implementation of `log/slog`'s [Handler interface](https://pkg.go.dev/log/slog#Handler) that ensures a strong correlation between log records and [Open-Telemetry spans](https://opentelemetry.io/docs/concepts/signals/traces/#spans) by...\n\n1. Adding [span and trace IDs](https://opentelemetry.io/docs/concepts/signals/traces/#span-context) to the log record.\n2. Adding context [baggage](https://opentelemetry.io/docs/concepts/signals/baggage/) members to the log record (can be disabled).\n3. Adding log record as [span event](https://opentelemetry.io/docs/concepts/signals/traces/#span-events) (can be disabled).\n4. Adding log record attributes to the span event (can be disabled).\n5. Setting [span status](https://opentelemetry.io/docs/concepts/signals/traces/#span-status) based on slog record level (only if \u003e= slog.LevelError).\n\n## Usage\n```go\nimport (\n    \"context\"\n    \"log/slog\"\n\n    \"go.opentelemetry.io/otel/baggage\"\n    \"go.opentelemetry.io/otel/trace\"\n\n    sdktrace \"go.opentelemetry.io/otel/sdk/trace\"\n    slogotel \"github.com/remychantenay/slog-otel\"\n)\n\n// 1. Configure slog.\nslog.SetDefault(slog.New(slogotel.OtelHandler{\n    Next: slog.NewJSONHandler(os.Stdout, nil),\n}))\n\n// 2. Set up your logger.\nlogger := slog.Default()\nlogger = logger.With(\"component\", \"server\")\n\n// 3. (Optional) Add baggage to your context.\nm1, _ := baggage.NewMember(\"key_1\", \"value_1\")\nm2, _ := baggage.NewMember(\"key_2\", \"value_2\")\nbag, _ := baggage.New(m1, m2)\nctx := baggage.ContextWithBaggage(context.Background(), bag)\n\n// 4. Start your span.\nctx, span := tracer.Start(ctx, \"operation-name\")\ndefer span.End()\n\n// 5. Log.\nlogger.InfoContext(ctx, \"Hello world!\", \"locale\", \"en_US\")\n```\n\n#### Example\nThe following initial log:\n```json\n{\n    \"time\": \"2023-09-11T08:28:02.77215605Z\",\n    \"level\": \"INFO\",\n    \"component\": \"server\",\n    \"msg\": \"Hello world!\",\n    \"locale\": \"en_US\"\n}\n```\n... will be written as:\n```json\n{\n    \"time\": \"2023-09-11T08:28:02.77215605Z\",\n    \"level\": \"INFO\",\n    \"component\": \"server\",\n    \"msg\": \"Hello world!\",\n    \"locale\": \"en_US\",\n    \"trace_id\": \"a9938fd7a6313e0f27f3fc87f574bff6\",\n    \"span_id\": \"ed58f84d8971bf60\",\n    \"key_1\": \"value_1\",\n    \"key_2\": \"value_2\"\n}\n```\n\nand the related span will look like:\n```json\n {\n \t\"Name\": \"GET /resources\",\n \t\"SpanContext\": {\n \t\t\"TraceID\": \"a9938fd7a6313e0f27f3fc87f574bff6\",\n \t\t\"SpanID\": \"ed58f84d8971bf60\",\n \t\t...\n \t},\n \t\"Parent\": {\n \t\t...\n \t},\n \t\"SpanKind\": 2,\n \t\"StartTime\": \"2023-09-11T08:28:02.761992425Z\",\n \t\"EndTime\": \"2023-09-11T08:28:02.773230425Z\",\n \t\"Attributes\": [{\n \t\t\t\"Key\": \"http.method\",\n \t\t\t\"Value\": {\n \t\t\t\t\"Type\": \"STRING\",\n \t\t\t\t\"Value\": \"GET\"\n \t\t\t}\n \t\t},\n\t\t...\n \t],\n \t\"Events\": [{\n \t\t\"Name\": \"log_record\",\n \t\t\"Attributes\": [{\n \t\t\t\t\"Key\": \"msg\",\n \t\t\t\t\"Value\": {\n \t\t\t\t\t\"Type\": \"STRING\",\n \t\t\t\t\t\"Value\": \"Hello world!\"\n \t\t\t\t}\n \t\t\t},\n \t\t\t{\n \t\t\t\t\"Key\": \"level\",\n \t\t\t\t\"Value\": {\n \t\t\t\t\t\"Type\": \"STRING\",\n \t\t\t\t\t\"Value\": \"INFO\"\n \t\t\t\t}\n \t\t\t},\n \t\t\t{\n \t\t\t\t\"Key\": \"time\",\n \t\t\t\t\"Value\": {\n \t\t\t\t\t\"Type\": \"STRING\",\n \t\t\t\t\t\"Value\": \"2023-09-11T08:28:02.77215605Z\"\n \t\t\t\t}\n \t\t\t},\n \t\t\t{\n \t\t\t\t\"Key\": \"locale\",\n \t\t\t\t\"Value\": {\n \t\t\t\t\t\"Type\": \"STRING\",\n \t\t\t\t\t\"Value\": \"en_US\"\n \t\t\t\t}\n \t\t\t},\n \t\t\t{\n \t\t\t\t\"Key\": \"component\",\n \t\t\t\t\"Value\": {\n \t\t\t\t\t\"Type\": \"STRING\",\n \t\t\t\t\t\"Value\": \"server\"\n \t\t\t\t}\n \t\t\t}\n \t\t],\n \t}],\n \t...\n }\n```\n\n## License\nApache License Version 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremychantenay%2Fslog-otel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremychantenay%2Fslog-otel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremychantenay%2Fslog-otel/lists"}