产品动态
库/框架 | 版本 |
database/sql | go1.12 to go1.23.0 |
github.com/segmentio/kafka-go | v0.4.1 to v0.4.47 |
google.golang.org/grpc | v1.14.0 to v1.66.0 |
net/http | go1.12 to go1.22.6 |
net/http的 Web 框架,如 Gin 等都支持。chmod +x otel-go-instrumentation
sudo OTEL_GO_AUTO_TARGET_EXE=</path/to/executable_binary> \\OTEL_SERVICE_NAME=<serviceName> \\OTEL_EXPORTER_OTLP_PROTOCOL=grpc \\OTEL_TRACES_EXPORTER=otlp \\OTEL_EXPORTER_OTLP_ENDPOINT=<endpoint> \\OTEL_RESOURCE_ATTRIBUTES=token=<token>,host.name=<hostName> \\./otel-go-instrumentation
</path/to/executable_binary> :应用可执行文件的路径,这里一定要是绝对路径。<serviceName>:应用名,多个使用相同 serviceName 接入的应用进程,在 APM 中会表现为相同应用下的多个实例。应用名最长63个字符,只能包含小写字母、数字及分隔符“ - ”,且必须以小写字母开头,数字或小写字母结尾。<endpoint>:前置步骤中拿到的接入点,注意这里必须添加http://前缀。<token>:前置步骤中拿到业务系统 Token。<hostName>:该实例的主机名,是应用实例的唯一标识,通常情况下可以设置为应用实例的 IP 地址。myService,运行路径为/root,业务系统 Token 为 myToken,主机名为 192.168.0.10,接入点以http://ap-guangzhou.apm.tencentcs.com:4317为例,完整的启动命令为:sudo OTEL_GO_AUTO_TARGET_EXE=/root/myService \\OTEL_SERVICE_NAME=myService \\OTEL_EXPORTER_OTLP_PROTOCOL=grpc \\OTEL_TRACES_EXPORTER=otlp \\OTEL_EXPORTER_OTLP_ENDPOINT=http://ap-guangzhou.apm.tencentcs.com:4317 \\OTEL_RESOURCE_ATTRIBUTES=token=myToken,host.name=192.168.0.10\\./otel-go-instrumentation
instrumentation loaded successfully字段表示接入成功:{"level":"info","ts":1725609047.2234442,"logger":"go.opentelemetry.io/auto","caller":"cli/main.go:119","msg":"starting instrumentation..."}{"level":"info","ts":1725609047.2235398,"logger":"Instrumentation.Manager","caller":"instrumentation/manager.go:195","msg":"loading probe","name":"net/http/server"}{"level":"info","ts":1725609047.388379,"logger":"go.opentelemetry.io/auto","caller":"cli/main.go:115","msg":"instrumentation loaded successfully"}
{"level":"info","ts":1725609014.2038825,"logger":"go.opentelemetry.io/auto","caller":"cli/main.go:86","msg":"building OpenTelemetry Go instrumentation ...","globalImpl":false}
OTEL_GO_AUTO_TARGET_EXE)错误。traces export: failed to exit idle mode: dns resolver: missing address
http://前缀导致。import (..."go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute"...)...var tracer = otel.Tracer("rolldice") // 创建 Tracer...func (s *Server) rollDice(w http.ResponseWriter, req *http.Request) {ctx, span := tracer.Start(req.Context(), "roll") // 新建一个 spandefer span.End()n := s.rand.Intn(6) + 1_, err := s.db.ExecContext(ctx, "INSERT INTO results (roll_value) VALUES (?)", n)if err != nil {panic(err)}span.SetAttributes(attribute.Int("roll.value", n)) // 添加 span attributesfmt.Fprintf(w, "%v", n)}
net/http 和 database/sql 实现。package mainimport ("database/sql""fmt""net/http""os"_ "github.com/mattn/go-sqlite3""go.uber.org/zap")const (sqlQuery = "SELECT * FROM contacts"dbName = "test.db"tableDefinition = `CREATE TABLE contacts (contact_id INTEGER PRIMARY KEY,first_name TEXT NOT NULL,last_name TEXT NOT NULL,email TEXT NOT NULL,phone TEXT NOT NULL);`tableInsertion = `INSERT INTO 'contacts'('first_name', 'last_name', 'email', 'phone') VALUES('Moshe', 'Levi', 'moshe@gmail.com', '052-1234567');`)type Server struct {db *sql.DB}// 初始化数据库func CreateDb() {file, err := os.Create(dbName)if err != nil {panic(err)}err = file.Close()if err != nil {panic(err)}}func NewServer() *Server {CreateDb()database, err := sql.Open("sqlite3", dbName)if err != nil {panic(err)}_, err = database.Exec(tableDefinition)if err != nil {panic(err)}return &Server{db: database,}}func (s *Server) queryDb(w http.ResponseWriter, req *http.Request) {ctx := req.Context()conn, err := s.db.Conn(ctx)if err != nil {panic(err)}// 注意这里一定要传递 `ctx` 或者 `req.Context()`,使 HTTP 请求和数据库的操作记录可以保持在一条链路中。// 如果在这里没有传递请求的 context,写成了 `s.db.Exec(tableInsertion)`,就会导致链路中断,HTTP span 和 database span 出现在两条链路中!_, err = s.db.ExecContext(ctx, tableInsertion)if err != nil {panic(err)}rows, err := conn.QueryContext(req.Context(), sqlQuery)if err != nil {panic(err)}logger.Info("queryDb called")for rows.Next() {var id intvar firstName stringvar lastName stringvar email stringvar phone stringerr := rows.Scan(&id, &firstName, &lastName, &email, &phone)if err != nil {panic(err)}fmt.Fprintf(w, "ID: %d, firstName: %s, lastName: %s, email: %s, phone: %s\\n", id, firstName, lastName, email, phone)}}
文档反馈