Go

Go is a programming language created by Robert Griesemer, Rob Pike, and Ken Thompson. Go is the cloud-native programming language of choice for many organizations.

Capabilities

Support and desupport

The Go release policy supports the last two major Go versions.

Whenever a new Golang version is released, we add support for that version. Dynatrace will add support for each minor and patch version; you can see the Version matrix for more details.

Dynatrace will follow this support model, but will support each Go version at least half a year longer to give our customers time for upgrades.

Go version Vendor released Vendor End of life Supported by Dynatrace until First supported Dynatrace OneAgent version Last supported Dynatrace OneAgent version
1.7 2016-08-15 2017-08-24 2018/12/31 1.129 1.157
1.8 2017-02-16 2018-02-16 2018/12/31 1.129 1.157
1.9 2017-08-24 2018-08-24 2019/06/30 1.129 1.171
1.10 2018-02-16 2019-02-25 2019/08/31 1.143 1.173
1.11 2018-08-24 2019-08-24 2020/02/28 1.155
1.12 2019-02-25 2020-02-25 2020/08/31 1.165
1.13 2019-09-03 2020-09-03 2021/03/31 1.179
1.14 2020-02-25 2021-02-25 2021/08/31 1.189
1.15 2020-08-11 2021-08-11 2022/02/28 1.203

Version Matrix

Each version range specifies versions the OneAgent has builtin support for, the upper bound in parentheses specifies the latest version that may be supported via external metadata.

OneAgent versions Go 1.13 Go 1.14 Go 1.15
v1.179 1.13.0 - -
v1.181 1.13.0 - 1.13.3 - -
v1.183 1.13.0 - 1.13.4 - -
v1.185 1.13.0 - 1.13.5 - -
v1.187 1.13.0 - 1.13.7 - -
v1.189 1.13.0 - 1.13.8 1.14.0 -
v1.191 1.13.0 - 1.13.9 1.14.0 - 1.14.1 -
v1.193 1.13.0 - 1.13.10 1.14.0 - 1.14.2 -
v1.195 1.13.0 - 1.13.11 1.14.0 - 1.14.3 -
v1.197, v1.199 1.13.0 - 1.13.12 1.14.0 - 1.14.4 -
v1.201 1.13.0 - 1.13.14 1.14.0 - 1.14.6 -
v1.203 1.13.0 - 1.13.15 1.14.0 - 1.14.8 1.15.0 - 1.15.1
v1.205 1.13.0 - 1.13.15 1.14.0 - 1.14.9 (1.14.15) 1.15.0 - 1.15.2 (1.15.8)
v1.207 1.13.0 - 1.13.15 1.14.0 - 1.14.10 (1.14.15) 1.15.0 - 1.15.3 (1.15.8)
v1.209 1.13.0 - 1.13.15 1.14.0 - 1.14.12 (1.14.15) 1.15.0 - 1.15.5 (1.15.8)
v1.211 1.13.0 - 1.13.15 1.14.0 - 1.14.14 (1.14.15) 1.15.0 - 1.15.7 (1.15.8)
v1.213 1.13.0 - 1.13.15 1.14.0 - 1.14.15 1.15.0 - 1.15.8

Up until OneAgent version 1.179, 32 bit executables were supported as well.

External metadata

Starting with OneAgent version 1.205, the agent has the capability to support newer Go versions by requesting data from the cluster. In case that request is successful and the agent receives the necessary data, it will be able to instrument an application built with a Go version the agent does not have builtin support for.

The version matrix therefore has two different upper bounds in each version range. The builtin Go versions are always supported, while the upper bound in parentheses may be supported if OneAgent can successfully request data from the server.

This does not yet apply to offline managed clusters, which currently do not have support for external metadata.

Known Limitations

Support limited to official, stable Go releases

Go support is limited to official, stable Go releases compiled using the golang toolchain.

OneAgent doesn't support binaries compiled using the gccgo toolchain.

Application binary must be dynamically linked

This restriction applies only to Linux systems and if Go static monitoring is disabled.

OneAgent fully automatic injection requires dynamically linked application binaries. Dynamic linking is automatically applied if the application uses certain standard runtime library packages (net/http).

In all other cases, dynamic linking can be enforced with the command line option -ldflags '-linkmode=external'. Caveat, disabling cgo (e.g. CGO_ENABLED=0) is not supported and the resulting application binary will be rejected by OneAgent.

Monitoring of statically linked application binaries

OneAgent supports Go static application monitoring as early adopter feature starting with version 1.203. It can be enabled in Settings/Monitoring/Monitored Technologies/Go.

Limitations

OneAgent fully automatic static injection is supported if the parent process (e.g. a shell like /bin/bash) which starts the statically linked Go binary is dynamically linked, or in case of Docker if the Go static application is running as the container entrypoint.
Note: On first use after enabling Go static monitoring, the parent process must be restarted to enable automatic injection.

When using Docker version less than 19.03.0 or Linux Kernel version less than 4.8, it is required to run the container with SYS_PTRACE capability, e.g.: docker run --cap-add=SYS_PTRACE <container> .... This capability is enabled by default for Docker 19.03.0 and Linux Kernel 4.8 or newer. It allows system calls between processes running in a container, which is a requirement for Go static monitoring.

Docker images (e.g. FROM scratch) which do not provide a C system library are not supported. The base image of a container can be easily changed as shown in the following example:

FROM scratch
COPY StaticGoMinimal /
CMD ["/StaticGoMinimal"]

Change base image to one which provides a C system library, e.g.:

FROM alpine:3.11
COPY StaticGoMinimal /
CMD ["/StaticGoMinimal"]

Side effects

The file proc/<pId>/exe refers to an executable with name oneagentdynamizer instead of Go application binary. This file is contained in the proc pseudo-filesystem which provides an interface to kernel data structures of running processes.

The application can't be built with the -linkshared option

Go supports dynamic linking of the Go standard library. This build mode is rarely used and OneAgent won't inject into applications built this way.

Sample application of -linkshared

go install -buildmode=shared -linkshared std
go build -linkshared GoMinimal.go

The resulting application binary will be rejected by OneAgent.

Applications that load Go plugins aren't supported

A Go plugin is a package compiled using the build flag -buildmode=plugin to produce a shared object file. This build mode is rarely used and OneAgent will disable deep monitoring when an application actually loads a Go plugin.

Vendored third party packages aren't supported

Go vendoring is used to include local copies of external dependencies in the project repository. It was especially used to pin versions of third party packages before Go module support was added. OneAgent will not monitor vendored packages, for example gRPC services are supported only when using Go modules or when importing go-grpc directly without using a dependency management system.

Application must contain a symbol table

OneAgent relies on information stored in the application binary files symbol table. By default, Go generates a symbol table into the application binary, but this can be suppressed by command line parameters or external tools like strip.

go run

The rarely used go run <application> command builds and runs the application on the fly. Because the output application file is temporary (deleted automatically after application termination), the application binary is generated without a symbol table. OneAgent therefore cannot monitor the generated application.

Support for musl libc

The musl libc library is a drop-in replacement for glibc. Starting with OneAgent version 1.167, Dynatrace supports musl libc-based Go applications (such as Alpine Linux).

The only additional requirement is that the application binary is built using the Go toolchain for alpine (golang:<version>-alpine) and the system linker by adding -ldflags '-linkmode external' to the build command line.