Release Notes.
- Support multi-address gRPC backends with
pick_firstfailover.
- Update the verified framework version ranges. Every plugin module now requires the newest version whose hook-point signatures (receiver, parameters, and results) match the last version previously tested (identical, or for dubbo-go identical through the
protocoltype aliases), and every scenario tests that version on Go 1.26 and Go 1.27. The new upper bounds are gin v1.12.0, go-restful v3.14.0, mux v1.8.1, iris v12.2.11, fasthttp v1.75.0, fiber v2.52.15, echo v4.16.0, goframe v2.10.3, dubbo-go v3.3.1, kratos v2.9.2, go-micro v4.11.2, gorm v1.31.2, gorm postgres driver v1.6.3, mongo-driver v1.17.10, go-sql-driver/mysql v1.10.1, pgx v5.11.0, go-elasticsearch v8.19.7, go-redis v9.23.0, amqp091-go v1.15.0, pulsar-client-go v0.21.0, kafka-go v0.4.51, logrus v1.10.2, and zap v1.28.0. Some lower bounds rise because those versions never actually built in their scenarios: kratos v2.6.3 is the first release whose test imports still resolve with the gRPC version the agent requires, the go-micro scenario depends on ago-micro/examplescommit that needs go-micro v4.9.0, the gorm scenario's MySQL driver needs gorm v1.25.1, dubbo-go starts at v3.0.2 because v3.0.1 does not carry the trace context to the provider, and go-sql-driver/mysql starts at v1.5.0 because older drivers do not implementdriver.DriverContext, sosql.Opennever parses the DSN and the sql plugin cannot attach the peer address. dubbo-go v3.3.2 keeps the hook signatures through type aliases, but it removes theconfigpackage that the scenario application uses, so it is not listed yet. The kratos scenario runs in CI again. - Support grpc v1.84.0. That release merged
processUnaryRPCandprocessStreamingRPCintoprocessRPC, removedsendResponse, and returns client streams wrapped inclientStreamWrapper, so with the previous plugin the client segment was never reported and server spans lost the RPC type tag and theSendResponsespan. The newplugins/grpc-v184handles v1.84.0 and later and reports the same spans as before;plugins/grpckeeps handling older releases and builds whose grpc version cannot be detected. Both share thegrpcplugin name. - go-redis: do not create spans for the commands go-redis sends while setting up a connection. Since v9.9.0 the setup runs through the client hooks, so
HELLOand theAUTHfallback exported the password in thecache.argsandcache.keytags, andSELECT,READONLY, andCLIENT SETNAME/SETINFO/MAINT_NOTIFICATIONS/TRACKINGappeared as cache operations of the user's trace, marked as errors against servers that do not support them. These commands are not traced when the application sends them either, sinceAUTHandHELLOcarry credentials and the others configure the connection. - Split the dubbo plugin by version. dubbo-go v3.3.1 moved the graceful-shutdown filter from
protocoltoprotocol/baseandprotocol/result, so the interceptors no longer compiled into that package.plugins/dubbokeeps the releases before v3.3.1 andplugins/dubbo-v331handles v3.3.1 and later; both share thedubboplugin name, and their type assertions no longer panic on unexpected arguments. With the Triple protocol of dubbo-go v3.3, the provider runs onnet/http, so the provider entry span is created by the http plugin and named by the dubbo plugin. - amqp: create producer spans for every publish API. Since amqp091-go v1.10.0,
PublishandPublishWithContextno longer go throughPublishWithDeferredConfirmWithContext, so they had no producer span and no context propagation;PublishWithDeferredConfirmis now intercepted too, with one span per message. The injected headers also reach messages published with nilHeaders. - zap: report logs after the pre-write hooks that zap v1.28.0 applies in
CheckedEntry.Write, so OAP receives the same entry and fields as the configured outputs instead of values a hook redacted or rewrote. - logrus: do not panic when formatting an entry whose
Datais nil, which logrus v1.10.0 and later keep nil inEntry.Dup.
- Update
docs/en/agent/support-plugins.mdwith the framework version ranges verified by the plugin test scenarios, and describe the two grpc plugins. - Update the Go versions of the published base images in
docs/en/setup/docker.mdto Go 1.26 and Go 1.27. - Describe in
docs/en/development-and-contribution/write-plugin-testing.mdhow each plugin test case pins its framework version and builds outside the repository workspace, and document thetoolkitandexcepted-fileoptions.
- Bump vulnerable dependencies in the agent module, the reporter (
plugins/core), and the go-agent tool.google.golang.org/grpcmoves from v1.55.0 to v1.83.2, the lowest release that fixes every current grpc advisory, including CVE-2026-33186 (GO-2026-4762, fixed in v1.79.3), the HTTP/2 issues fixed in v1.82.1 and v1.83.1, and CVE-2026-84445 (GO-2026-6443), which was reintroduced in v1.83.0 and fixed again in v1.83.2.golang.org/x/netmoves from v0.10.0 to v0.58.0 (required by grpc v1.83.2; this is above v0.56.0, which is the lowest release that fixes every x/net advisory except the ones fixed only in v0.60.0) andgolang.org/x/textmoves to v0.41.0. These releases require Go 1.25, so the module floor and CI move from Go 1.24 to Go 1.25 and Go 1.26. golangci-lint moves from v1.64.8 to v2.5.0, because v1.64.8 is built with Go 1.24 and refuses modules that declarego 1.25.0. The v2 config keeps the v1 staticcheck set (no quickfix rewrites) and leavesgrpc.Dialin place, since it stays supported through grpc 1.x andNewClientwould change the reporter's resolver scheme and idle behavior. grpc v1.84.0 needs the same Go 1.25 and fixes no additional advisory.golang.org/x/netv0.60.0 fixes the remaining HTTP/2 advisories but requires Go 1.26; the Go 1.26 floor entry below takes it. - Fix panic when converting NoInit histograms during meter collect.
- Fix concurrent map access in RuntimeContext Get/Set/clone.
- Move the module floor from Go 1.25 to Go 1.26 and test on Go 1.26 and Go 1.27, since Go 1.25 reached end of life with the Go 1.27 release. This lets the agent module and the reporter (
plugins/core) takegolang.org/x/netv0.61.0, which fixes the remaining HTTP/2 advisories (GO-2026-6603, GO-2026-6610, GO-2026-6611, GO-2026-6612, GO-2026-6617; fixed in v0.60.0), andgolang.org/x/textv0.43.0. The floor stays at Go 1.26 rather than 1.27 because the agent'sgodirective becomes the minimum for every application that imports it, and Go 1.26 is still supported upstream. The CI build matrix, plugin scenarios, e2e and Windows jobs, and the published base images (go1.26,go1.27) move with it. golangci-lint moves from v2.5.0 to v2.15.0 (built with Go 1.27) and is installed fromhttps://golangci-lint.run/install.sh, because older copies of the install script pick the SBOM checksum for every release since v2.12.2. goconst keeps its previous scope (composite literals excluded), and thegrpc.Dialdeprecation exclusions also match staticcheck's new fully qualified messages. - Build each plugin test case outside the repository
go.work. Minimal version selection across the workspace lifted the framework to the newest version required by any plugin or scenario module, so about two thirds of the cases did not build the version they were named after. The go-elasticsearch and goframe scenarios now declare the full module path (/v8,/v2) so the per-case version is applied at all, and the cross-goroutine scenario uses the local toolkit. - Remove every reachable third-party advisory from the
skywalking-go-agentbinary, which links the plugin modules. go-git moves to v5.19.3, go-billy to v5.9.2, and circl to v1.6.5 through the go-micro plugin, and amqp091-go moves to v1.15.0. - Fix a fatal
semacquire not on the G stackcrash when a goroutine starts while another goroutine holds the lock of the starting goroutine's active span, for example a worker that tags an async span throughSpanRef. The agent took the trace context snapshot for the new goroutine inruntime.newproc1, which runs on the system stack, where waiting for a lock is a fatal error. The snapshot is now taken inruntime.newprocandruntime.newcoro, on the stack of the goroutine that runs thegostatement, right before they switch to the system stack, andnewproc1only hands it over. It is not taken while the goroutine holds runtime locks, as when the runtime starts its GC workers, where blocking is fatal too. Goroutines that the runtime starts for debugger calls, fortesting/synctestbubbles, and for GC workers no longer inherit the trace context. - Fix a panic at program start when the application logs through logrus or zap from a package
initfunction that runs before the agent core is initialized. The toolkit logging API no longer panics in that case either. - Fix a toolkit exit span leaking when its injector returns an error. The span was never ended, so the whole segment was never reported.
- grpc: end the exit span of every client stream exactly once. A stream whose
NewStreamfailed, a stream wrapped by a client stream interceptor, and a stream that ended without aRecvMsg(canceled context, closed connection,SendMsgerror) left the exit span open, so the whole segment, usually the one of the incoming request, was never reported. The span is now finished from anOnFinishcall option that grpc calls once, with the final status, when the stream finishes, so a stream that ends with an error, including a canceled stream, is an error span. A stream interceptor that panics after creating the stream no longer leaves the span open either. - http, mux, goframe: keep the optional interfaces of the response writer. The wrappers hid
http.Flusherand thehttp.ResponseControllerfeatures, which broke server-sent events and response deadlines, and the goframe wrapper also hidhttp.Hijacker, so GoFrame WebSocket upgrades failed with HTTP 500. The wrappers now implementhttp.Flusherandhttp.Hijackerexactly when the wrapped writer does, andUnwrapforhttp.ResponseController. - echov4: serve a request whose
sw8header cannot be decoded, untraced, instead of answering HTTP 500. When a handler panics or callsruntime.Goexit, end the entry span and mark it as an error, without recovering the panic, so the segment is reported and the next request on the connection is not added to the stale span. - mongo: do not crash the application when a user
CommandMonitorsets only some of its callbacks, and finish the command span also when the user'sSucceededorFailedcallback panics. - sql: end the span of
(*sql.Conn).Raw. The interceptor read a second result thatRawdoes not return, so the span never ended and the whole segment was never reported. - gorm: end the gorm span of an operation with a scope that returns a session, such as
tx.WithContext(ctx). The span was stored in a new clone of the statement, where the end callback never found it, so the segment was never reported. Also end the gorm span, marked as an error, when a gorm callback or a hook such asAfterFindpanics: gorm runs its callbacks withoutdefer, so the span stayed open. - pulsar: do not crash the application on
SendAsyncwith a nil callback, which the client allows. Do not panic on a failedReceive, which received nothing and creates no span. Stop sending a broker lookup request on every send and receive to find the span peer: the peer andmq.brokerare now the client's service URL, as in the Java agent, instead of the address of the broker that owns the topic. - rocketmq: end the exit span of a failed
SendSync, which stayed open and kept the segment from being reported, and do not panic on a send without messages. - kratos: do not panic in the client middleware when a body-less HTTP call reads the reply header into a nil
http.Header. Since kratos v2.7.2, that header is sent as the request header. - go-micro: do not fail a call, stream, or publish when its exit span cannot be created, for example a call with an empty service name and
client.WithAddress. The call runs untraced, and the peer of the caller's span does not change.
Moving to Go 1.26 and testing every plugin case with its own framework version drops the following versions. No version was dropped because Go 1.26 cannot build it; the reasons are listed per row.
| Library | No longer supported | Supported in this release | Reason |
|---|---|---|---|
| Go | 1.25 and earlier | 1.26, 1.27 | Go 1.25 reached end of life. The agent module's go directive is the minimum for every application that imports it. |
| grpc | before v1.83.2 | v1.83.2 to v1.84.0 | The agent module requires grpc v1.83.2, so applications cannot select an older release. |
| kratos | v2.3.1 to v2.6.2 | v2.6.3 to v2.9.2 | These releases' tests import google.golang.org/grpc/test/grpc_testing, which the required grpc no longer contains, so their modules do not resolve. |
| go-micro | v4.6.0 to v4.8.1 | v4.9.0 to v4.11.2 | Never tested as named. The test application needs go-micro v4.9.0 through go-micro/examples. |
| gorm | v1.22.0 to v1.25.0 | v1.25.1 to v1.31.2 | Never tested as named. The tested MySQL driver needs gorm v1.25.1. |
| go-sql-driver/mysql | v1.4.0 to v1.4.1 | v1.5.0 to v1.10.1 | No driver.DriverContext, so sql.Open never parses the DSN and the sql plugin creates no spans. |
| dubbo-go | v3.0.1 | v3.0.2 to v3.3.1 | Does not carry the trace context to the provider. |
| gin | v1.7.0 to v1.8.x | v1.9.0 to v1.12.0 | Listed in the documentation but not covered by any test case. |
| iris | v12.1.x | v12.2.0 to v12.2.11 | Listed in the documentation but not covered by any test case. |
| go-redis | v9.0.3 | v9.0.4 to v9.23.0 | Listed in the documentation but not covered by any test case. |
- Support Windows plugin test.
- Support Kafka reporter.
- Add recover to goroutine to prevent unexpected panics.
- Add mutex to fix some data race.
- Replace external
goapidependency with in-repo generated protocols. - Support pprof profiling.
- Align the agent with the supported Go releases (retire EOL Go 1.19-1.23): publish Go 1.24, 1.25, 1.26 base images, bump the module
go.modfloor to Go 1.24, and run the CI build, plugin, and e2e jobs on Go 1.24-1.26. - Support managing toolkit spans across goroutines through
SpanRef.
- Support gRPC v1.81.1 with Go 1.25 and Go 1.26.
- Fix gRPC server tracing with recent internal stream types.
- Fix plugin interceptors bypassed on Windows.
- Fix wrong tracing context switch when trace ignore plugin activated.
- Fix data race when sending trace data to reporter.
- Fix multiple data races in span lifecycle, correlation context and segment collection.
- Add recover protection for the metrics, profile and segment-transform goroutines.
- Fix the RocketMQ batch consumer span: report once with one segment reference per message (new
ExtractContextAPI). - Fix nil dereference and wrong span ownership in the RocketMQ/Pulsar async producer callbacks.
- Fix concurrent finish flags of the gRPC streaming client and the go-micro socket close.
- Fix the MongoDB command span to complete through the async API (events may fire on different goroutines).
- Fix the gorm span storage to be per-statement and the mux response writer wrapping a nil writer.
- Add recover protection for the kafka instance-check and gRPC profile-fetch goroutines.
- Fix unsynchronized consumer-tag map access in the AMQP plugin (fatal concurrent map read/write).
- support attaching events to span in the toolkit.
- support record log in the toolkit.
- support manually report metrics in the toolkit.
- support manually set span error in the toolkit.
- Support goframev2 goframev2.
- Add docs for
AddEventinTracing APIs - Add
Logging APIsdocument into Manual APIs. - Add
Metric APIsdocument into Manual APIs.
- Fix wrong docker image name and
-versioncommand. - Fix redis plugin cannot work in cluster mode.
- Fix cannot find file when exec build in test/plugins.
- Fix not set span error when http status code >= 400
- Fix http plugin cannot provide peer name when optional Host is empty.
- Fix Correctly instrument newproc1 for Go 1.23+ parameter counts
- Add go
1.23support. - Remove go
1.16,1.17, and1.18support.
- Add support trace ignore.
- Enhance the observability of makefile execution.
- Update the error message if the peer address is empty when creating an exit span.
- Support enhancement go
1.23.
- Support Pulsar MQ.
- Support Segmentio-Kafka MQ.
- Support http headers collection for Gin.
- Support higher versions of grpc.
- Support go-elasticsearchv8 database client framework.
- Support
http.Hijackerinterface for mux plugin. - Support collect statements and parameters in the Gorm plugin.
- Fix panic error when root span finished.
- Fix when not route is found, the gin operation name is "http.Method:", example: "GET:".
- Fix got
span type is wrongerror when creating exit span with trace sampling.
- Add support ignore suffix for span name.
- Adding go
1.21and1.22in docker image.
- Support setting a discard type of reporter.
- Add
redis.max_args_bytesparameter for redis plugin. - Changing intercept point for gin, make sure interfaces could be grouped when params defined in relativePath.
- Support RocketMQ MQ.
- Support AMQP MQ.
- support Echov4 framework.
- Fix users can not use async api in toolkit-trace.
- Fix cannot enhance the vendor management project.
- Fix SW_AGENT_REPORTER_GRPC_MAX_SEND_QUEUE not working on metricsSendCh & logSendCh chans of gRPC reporter.
- Fix ParseVendorModule error for special case in vendor/modules.txt.
- Fix enhance method error when unknown parameter type.
- Fix wrong tracing context when trace have been sampled.
- Fix enhance param error when there are multiple params.
- Fix lost trace when multi middleware
handlerFuncinginplugin. - Fix DBQueryContext execute error in
sqlplugin. - Fix stack overflow as endless logs triggered.
- Support manual tracing APIs for users.
- Support mux HTTP server framework.
- Support grpc server and client framework.
- Support iris framework.
- Support fasthttp framework.
- Support fiber framework.
- Add
Tracing APIsdocument intoManual APIs.
- Fix Docker image not supporting the
arm64platform.
- Enhance the plugin rewrite ability to support
switchandif/elsein the plugin codes. - Support inject the skywalking-go into project through agent.
- Support add configuration for plugin.
- Support metrics report API for plugin.
- Support report Golang runtime metrics.
- Support log reporter.
- Enhance the
logruslogger plugin to support adapt without any settings method invoke. - Disable sending observing data if the gRPC connection is not established for reducing the connection error log.
- Support enhance vendor management project.
- Support using base docker image to building the application.
- Support go-redis v9 redis client framework.
- Support collecting Native HTTP URI parameter on server side.
- Support Mongo database client framework.
- Support Native SQL database client framework with MySQL Driver.
- Support Logrus log report to the backend.
- Support Zap log report to the backend.
- Combine
Supported LibrariesandPerformance TestintoPluginssection. - Add
Tracing, Metrics and Loggingdocument intoPluginssection.
- Fix throw panic when log the tracing context before agent core initialized.
- Fix plugin version matcher
tryToFindThePluginVersionto support capital letters in module paths and versions.
- Initialize the agent core and user import library.
- Support gRPC reporter for management, tracing protocols.
- Automatic detect the log frameworks and inject the log context.
- Support Gin framework.
- Support Native HTTP server and client framework.
- Support Go Restful v3 framework.
- Support Dubbo server and client framework.
- Support Kratos v2 server and client framework.
- Support Go-Micro v4 server and client framework.
- Support GORM v2 database client framework.
- Support MySQL Driver detection.
- Initialize the documentation.