Open-source project
apache/skywalking-go avatar
apache/skywalking-go

apache/skywalking-go: what the Go auto-instrument agent can and cannot do for you

The Golang auto-instrument Agent for Apache SkyWalking, which provides the native tracing/metrics/logging abilities for Golang projects.

361 stars118 forksGoApache-2.0

At a glance

What is it?
Apache SkyWalking's Go agent instruments a compiled binary at build time rather than through a runtime hook. The README and the release history tell you what that buys, and what it quietly costs.
Who is it for?
Adopt apache/skywalking-go if you already run a SkyWalking backend, want traces, metrics and logs from Go services without editing handler code, and are willing to rebuild your binaries through the agent's wrapper. Do not adopt it if you need a v1.0 API guarantee, if your build pipeline cannot tolerate a rewritten compile step, or if your collector is OpenTelemetry-native and you have no SkyWalking OAP deployment.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 40 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem: instrumenting Go without touching every handler

Go compiles to a static binary, which makes the runtime-attach tricks common in Java and Python unavailable. There is no JVM agent slot to hook and no interpreter to monkey-patch. The practical consequence is that most Go teams either hand-write spans around every outbound call, or they accept no tracing at all. SkyWalking Go exists to remove that choice. The README describes it as the Golang auto-instrument Agent for Apache SkyWalking, providing native tracing, metrics and logging abilities for Golang projects. The audience is teams already running a SkyWalking backend who have Go services in the same estate and do not want a second, differently-shaped observability stack for them. If you have no SkyWalking deployment, the agent has nowhere to send its data and the question is moot.

Build-time rewriting instead of a runtime hook

The mechanism is the part worth understanding before you adopt anything. Because Go gives no runtime attachment point, the agent works at compile time: the toolchain is wrapped so that the instrumentation is injected while the binary is being produced. The repository name and description both say auto-instrument, and the topics list includes auto-instrumentation alongside distributed-tracing, metrics and logging. The practical data flow is: your source is compiled through the agent's build step, the resulting binary carries the instrumentation, and at runtime that binary reports traces, metrics and logs to a SkyWalking backend. The benefit is that instrumentation survives into production without a separate process to attach and without a sidecar. The cost is that the binary is no longer the artifact your compiler alone produced. That is a real change in your supply chain, and it deserves more scrutiny than a library import would.

Getting it into a build: what the material actually specifies

The README is thin on commands. It points to the official documentation at skywalking.apache.org/docs under the GoAgent section, and that is where the install and build instructions live. The README itself gives the project identity, the contact channels, and the Apache 2.0 licence, and nothing else operational. I am not going to reconstruct a build command from memory and present it as if it came from this repository, because the README does not contain one. What the material does establish is the shape of the workflow: you install the agent tooling, then compile your service through it, then point the running binary at a SkyWalking backend. Treat the official GoAgent documentation as the source of truth for the exact invocation and for the configuration keys, and treat the README as an index rather than a guide. That is a documentation gap worth noting for anyone evaluating this on a short timeline.

The release cadence tells you more than the feature list

Three releases are listed: v0.5.0 in August 2024, v0.6.0 in April 2025, and v0.7.0 in August 2026. The gaps are roughly eight months and then sixteen months. The version numbers are still in the 0.x line after that span. Read together, those two facts say something concrete: this is a project that ships deliberately and has not yet declared a stable API. For an instrumentation agent that rewrites your build, an unstable API is not a cosmetic concern. Plugin coverage, configuration keys and the build wrapper's interface can all move between minor versions, and a 0.x version number is the project telling you it reserves the right to do so. Plan for reading release notes before every upgrade rather than assuming a drop-in replacement. The last push timestamp on the default branch is the same day as the v0.7.0 release, so the project is active rather than dormant, but active and stable are different properties.

Where this is the wrong tool

The clearest failure mode is the build pipeline itself. Any environment that compiles Go inside a locked-down container, uses a hermetic build system with pinned toolchains, or requires reproducible builds verified against a hash will fight this agent. You are inserting a rewriting step between source and binary, and every one of those practices exists to prevent exactly that insertion. A second limitation is coverage. Auto-instrumentation is only as good as the plugin set for the libraries you import, and the README does not enumerate that set. If your services lean on an HTTP framework or a database driver the agent does not recognise, you get a partially instrumented binary and no error telling you which calls went untraced. That silent-partial-coverage behaviour is the worst kind of observability bug, because the dashboard looks fine and the gaps are invisible. Verify plugin coverage against your actual dependency list before you commit, not after.

The alternative: OpenTelemetry Go and manual spans

The obvious comparison is OpenTelemetry's Go SDK. The difference in approach is fundamental rather than cosmetic. OpenTelemetry Go is a library you import. You call the tracer API, wrap your handlers, and the instrumentation is explicit in your source. Nothing rewrites your binary, so your build stays hermetic and your toolchain stays pinned. The price is that you write the spans yourself, or you pull in per-library instrumentation packages that you also wire up by hand. SkyWalking Go inverts that: less code in your repository, more machinery in your build. Neither is strictly better. If you already run SkyWalking and your priority is getting traces out of a large Go codebase without a code-touching migration, the build-time approach is the shorter path. If your priority is a standard wire format and a vendor-neutral pipeline, the OpenTelemetry SDK is the one that keeps your options open, at the cost of the manual wiring you were trying to avoid.

Licence, maintenance and what an upgrade actually costs

The licence is Apache 2.0, stated in the README and in the LICENSE file at the repository root. That is a permissive licence with a patent grant, and it is the same licence as the SkyWalking project it reports to, which keeps the compliance story simple. It is not legal advice; if your organisation has a licence review process, run it. On maintenance, the honest assessment from the available material is that the upgrade cost is non-trivial for a 0.x project. Every minor version bump is a potential change to the build wrapper, the plugin set or the configuration keys, and because instrumentation happens at compile time, a regression surfaces as a broken build or as missing telemetry rather than as a runtime exception you can catch in staging. Budget for a rebuild-and-compare step on each upgrade, and keep a build of the previous agent version available so you can bisect a regression by swapping the toolchain rather than the source. The project's contact channels, the dev mailing list and the Apache Slack channel, are listed in the README if you need to ask about a specific plugin's status.

Editorial conclusion

Adopt apache/skywalking-go if you already run a SkyWalking backend, want traces, metrics and logs from Go services without editing handler code, and are willing to rebuild your binaries through the agent's wrapper. Do not adopt it if you need a v1.0 API guarantee, if your build pipeline cannot tolerate a rewritten compile step, or if your collector is OpenTelemetry-native and you have no SkyWalking OAP deployment. Before committing, verify three things: that the current release line has reached a version you consider stable, that the agent's bundled plugin set covers the frameworks your services actually import, and that your CI can run the agent's build command reproducibly across every binary you ship.

Official sources

  1. apache/skywalking-go on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes