{"id":25943334,"url":"https://github.com/asppj/lolita","last_synced_at":"2025-12-14T20:11:53.936Z","repository":{"id":57511345,"uuid":"224958274","full_name":"asppj/lolita","owner":"asppj","description":"基于gin 微服务opentrace集成","archived":false,"fork":false,"pushed_at":"2023-03-16T08:17:05.000Z","size":453,"stargazers_count":14,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-23T12:56:57.414Z","etag":null,"topics":["gin-web","grpc","jaeger"],"latest_commit_sha":null,"homepage":null,"language":"Go","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/asppj.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-30T04:16:22.000Z","updated_at":"2023-03-16T08:22:12.000Z","dependencies_parsed_at":"2024-06-19T05:29:38.819Z","dependency_job_id":"85d10b8a-0dc6-4e09-8ed8-7132732e068a","html_url":"https://github.com/asppj/lolita","commit_stats":null,"previous_names":["asppj/t-go-opentrace"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asppj%2Flolita","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asppj%2Flolita/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asppj%2Flolita/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asppj%2Flolita/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asppj","download_url":"https://codeload.github.com/asppj/lolita/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241801255,"owners_count":20022390,"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":["gin-web","grpc","jaeger"],"created_at":"2025-03-04T07:15:53.147Z","updated_at":"2025-12-14T20:11:48.878Z","avatar_url":"https://github.com/asppj.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.com/asppj/lolita.svg?branch=master)](https://travis-ci.com/asppj/lolita)\r\n1. Logging - 用于记录离散的事件。例如，应用程序的调试信息或错误信息。它是我们诊断问题的依据。\r\n2. Metrics - 用于记录可聚合的数据。例如，队列的当前深度可被定义为一个度量值，在元素入队或出队时被更新；HTTP 请求个数可被定义为一个计数器，新请求到来时进行累加。\r\n3. Tracing - 用于记录请求范围内的信息。例如，一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。\r\n\r\n## Opentrace\r\n\r\n1. 埋点：gin-web,http 请求，grpc 请求封装并埋点；\r\n2. 收集：zipkin,AppDash,jaeger 选择其一（阿里云日志服务优先）\r\n3. 展示：\r\n\r\n### 埋点\r\n\r\n1. Inject 请求方注入\r\n    - http header\r\n    - grpc with 接口\r\n2. Extract 服务方提取\r\n    - http header\r\n    - grpc with 接口\r\n\r\n### 1. gin-web 服务方 埋点(完成，待测)\r\n\r\n\u003e 添加中间件的方式\r\n\r\n### 2. requests 请求 埋点（完成，待测）\r\n\r\n\u003e封装 GET、POST、DELET、PUT 等 http 请求方法\r\n\r\n### 3. grpc 埋点（完成，待测）\r\n\r\n\u003egrpc 使用 grpc 提供的钩子函数\r\n\r\n### 4. DB 驱动埋点\r\n\r\n\u003e1. mongodb 埋点 （完成）\r\n\u003e2. redis 埋点 （未开始）\r\n\u003e3. es 埋点 （完成）\r\n\r\n## opentrance-go 介绍\r\n\r\n### 1. Trace 调用链\r\n\r\n### 2. Span 调用链节点\r\n\r\n#### 1. Span-Tag 调用链节点标签\r\n\r\n```text\r\next.PeerHostname.Set(sp, c.Request.Host)\r\next.PeerAddress.Set(sp, c.Request.RemoteAddr)\r\next.PeerService.Set(sp, c.ClientIP())\r\next.HTTPStatusCode.Set(sp, uint16(statusCode))\r\next.HTTPMethod.Set(sp, c.Request.Method)\r\next.HTTPUrl.Set(sp, c.Request.URL.Path)\r\n ```\r\n\r\n#### 2. Span-Log 调用链节点日志\r\n\r\n```golang\r\nspan.LogKV(\"Request:\", ctx.Request)\r\nspan.LogFields(\"Request:\", ctx.Request)\r\n```\r\n\r\n#### 3. Baggage item 全局范围不属于 span\r\n\r\n```golang\r\n// set\r\nspan.SetBaggageItem(\"greeting\", greeting)\r\n// get\r\ngreeting := span.BaggageItem(\"greeting\")\r\n```\r\n\r\n#### 4. Sampling,采样[0,1]\r\n\r\n\u003esampling.priority - integer\r\n\r\n```text\r\n1. const，全量采集，采样率设置0,1 分别对应打开和关闭\r\n2. probabilistic ，概率采集，默认万份之一，0~1之间取值，\r\n3. rateLimiting ，限速采集，每秒只能采集一定量的数据\r\n4. remote ，一种动态采集策略，根据当前系统的访问量调节采集策略\r\n```\r\n\r\n#### inject/extract \r\n\r\n\u003echildOf、followOf\r\n\r\n```text\r\n1. opentracing.GlobalTracer().Extract 方法提取HTTP头中的spanContexts\r\n2. opentracing.ChildOf 方法基于提取出来的spanContexts生成新的child spanContexts\r\n3. opentracing.GlobalTracer().StartSpan 方法生成一个新的span\r\n4. github.com/opentracing/opentracing-go/ext 通过ext可以为追踪添加一些tag来展示更多信息，比如URL，请求类型(GET，POST...), 返回码\r\n5. sp.Finish() 结束这一个span\r\n```\r\n\r\n#### context 传递 span\r\n\r\n```golang\r\n// 存储到 context 中\r\nctx := context.Background()\r\nctx = opentracing.ContextWithSpan(ctx, span)\r\n//....\r\n\r\n// 其他过程获取并开始子 span\r\nspan, ctx := opentracing.StartSpanFromContext(ctx, \"newspan\")\r\ndefer span.Finish()\r\n// StartSpanFromContext 会将新span保存到ctx中更新\r\n\r\n```\r\n\r\n### context 传递\r\n\r\n#### 网络方式传递\r\n\r\nExtrect 从 Header 中获取  \r\nExtrect 从 grpc Ctx 中提取  \r\ninject 注入  Header\r\nInject 注入 grpc Ctx\r\n\r\n```golang\r\n# 进程中\r\nopentracing.SpanFromContext(ctx)\r\n# 或\r\nspan, ctx := opentracing.StartSpanFromContext(ctx, \"newspan\")\r\ngin.Context:ctx.Request.Context()\r\ngin.Context!=context.Context!=opentracing.SpanContext\r\nmongodb/redis/es:\r\n\r\n```\r\n\u003e\r\n\u003e - context 不再使用 DefaultContext()\r\n\u003e - 统一使用  gin.request.Context()[因为携带了 span ]\r\n\u003e - 另外添加中间件自定义每个接口的超时时间\r\n\r\n## jaeger 搭建(本地)\r\n\r\n\u003e all_in_one 镜像 tools-\u003ejaeger-\u003edocker-compose.yml\r\n\r\n## prometheus metrics 统计\r\n\r\n### prometheus 收集数据\r\n\r\n### Grafana 展示数据\r\n\r\n### prometheus 指标类型\r\n\r\n1. Counter 单调增\r\n2. Guage  可增减\r\n3. Historygram 直方图\r\n4. Summary 聚合图（1-10 占比，10-20 占比。。。）\r\n\r\n#### gin-ext web 中间件\r\n\r\n 1. 启动时长-uptime\r\n 2. 请求总数-http_request_count_total\r\n 3. 请求延时-http_request_duration_seconds\r\n 4. 请求字节-http_request_size_bytes\r\n 5. 响应字节-http_response_size_bytes\r\n\r\n#### [grpc 中间件](https://github.com/grpc-ecosystem/go-grpc-middleware)\r\n\r\n#### kafka golang 驱动封装\r\n\r\n##### 消费者\r\n\r\n 1. 消费延时-kafka_consumer_duration_seconds\r\n 2. 消费成功数-kafka_consumer_success_total\r\n 3. 消费失败数-kafka_consumer_failed_total\r\n 4. Payload 字节数-kafka_consumer_payload_byte_size\r\n\r\n##### 生产者\r\n\r\n1. 生产延时-kafka_product_duration_seconds\r\n2. 生产成功数-kafka_product_success_total\r\n3. 生产失败数-kafka_product_failed_total\r\n4. Payload 字节数-kafka_product_payload_byte_size\r\n\r\n#### kafka exporter 监控\r\n\r\n\u003e 与版本有关[参考](https://blog.csdn.net/sweatOtt/article/details/79090175)\r\n\r\n### 官方 sdk\r\n\r\n- github.com/prometheus/client_golang\r\n\r\n### 工具\r\n[dem 开发辅助工具 https://github.com/asppj/dem](https://github.com/asppj/dem)\r\n\r\n### opentrace 参考资料\r\n\r\n1. [几种分布式调用链监控组件的比较](https://juejin.im/post/5a0579e6f265da4326524f0f#heading-0)\r\n2. [opentracing 翻译版](https://wu-sheng.gitbooks.io/opentracing-io/content/pages/spec.html)\r\n3. [grpc-opentracing 中间件](https://godoc.org/github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc)\r\n4. [openTracing 讲解](https://github.com/yurishkuro/opentracing-tutorial)\r\n5. [阿里云日志服务配置 aliyun-log-jaeger](https://github.com/aliyun/aliyun-log-jaeger/blob/master/README_CN.md?)\r\n\r\n### prometheus 参考资料\r\n\r\n1. [prometheus 介绍](https://www.imhanjm.com/2019/10/06/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3prometheus(go%20sdk)/)\r\n2. [【监控】Kafka - 详细指标](https://www.jianshu.com/p/92ae7e5992e2)\r\n3. [Grafana 与数据可视化](https://yunlzheng.gitbook.io/prometheus-book/part-ii-prometheus-jin-jie/grafana/grafana-panels)\r\n3. [其他参考](https://github.com/apache/skywalking-kubernetes)\r\n\r\n\r\n### Thanks\r\n[![avatar](jetbrains.png)](https://www.jetbrains.com/?from=lolita)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasppj%2Flolita","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasppj%2Flolita","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasppj%2Flolita/lists"}