# 7.04 Middleware-OpenTelemetry总结

## PART1. 关联上游

![关联上游](https://1407465062-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FyoSgzgsmuneFp7VNWUbE%2Fuploads%2Fgit-blob-d42dbe82bc684bb4c55197d315d5c6f975aa3abc%2F%E5%85%B3%E8%81%94%E4%B8%8A%E6%B8%B8.png?alt=media)

记录span的Context要关联上请求中的span(`Context.Req.Context()`).

**如果你不知道该在span中记录什么标签,那你就去抄Kratos或go-zero或ego中的**

## PART2. 获取响应状态码

![获取响应状态码](https://github.com/step-by-step-wiki/GoBook/blob/main/img/16.Middleware-OpenTelemetry%E6%80%BB%E7%BB%93/%E8%8E%B7%E5%8F%96%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.png)

这里额外提一点,我们在span中记录的是请求命中的路由,而非请求的路径.这是因为路径中可能携带有多个路径参数,使得整个URL变得较为复杂

另外这里是因为我们无法从`http.ResponseWriter`直接获取响应状态码,只能是通过**将响应数据和响应码分别写入到`Context`的两个成员属性上,在执行完所有对响应码和响应数据的读写操作后(即返回相应之前),将响应数据和响应码刷到响应中**的方式,来获取响应数据和响应码.**相当于缓存了响应数据和响应码.等到所有的中间件都操作完了这份缓存的响应数据和响应码之后,返回响应之前,将它们刷到响应中**

![flashResp的执行时机](https://1407465062-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FyoSgzgsmuneFp7VNWUbE%2Fuploads%2Fgit-blob-cfcf16a60f04c7e9c03d0095ac8166474700a6bf%2FflashResp%E7%9A%84%E6%89%A7%E8%A1%8C%E6%97%B6%E6%9C%BA.png?alt=media)

TODO:可能我在AOP那一章节里对于中间件的组装顺序和执行顺序的解释是有误的,这个我需要确认
