Reporte datos de rastreo desde una aplicación Go hacia Managed Service for OpenTelemetry mediante un agente de SkyWalking para Go. Una vez reportados los datos, podrá monitorear la aplicación y consultar información como la topología de la aplicación, trazas, transacciones anómalas, transacciones lentas y análisis de SQL.
ARMS también proporciona un agente desarrollado internamente para aplicaciones Go. Este agente cuenta con soporte comercial e instrumenta las aplicaciones sin intrusión en el código. Para obtener más información, consulte Monitor Go applications.
Elección de un agente de SkyWalking para Go
(Recomendado) Utilice skywalking-go. Es el agente más reciente de SkyWalking para Go, cuenta con soporte oficial estable e instrumenta su aplicación prácticamente sin intrusión en el código.
Go2Sky es el agente anterior de SkyWalking para Go. Aunque tiene una gran base de usuarios, su nivel de intrusión es alto, motivo por el cual SkyWalking lanzó skywalking-go. En este tema se describe el procedimiento de integración para ambos agentes, de modo que pueda reportar datos a la consola de Managed Service for OpenTelemetry.
|
Dimensión |
skywalking-go |
Go2Sky |
|
Instrumentación |
Prácticamente sin intrusión en el código. Se especifica el agente con la bandera |
Alta intrusión. Debe agregar un hook para cada plugin en su proyecto. |
|
Estado de mantenimiento |
Agente más reciente de SkyWalking para Go, con soporte oficial estable. |
El soporte finalizó tras el lanzamiento oficial de skywalking-go. El sitio web oficial indica que Go2Sky está retirado, lo que significa que ya no recibe mantenimiento y SkyWalking no acepta pull requests para este agente. |
|
Base de usuarios |
Menor base de usuarios en comparación con Go2Sky. |
Amplia base de usuarios. |
SkyWalking continúa migrando los plugins de Go2Sky a skywalking-go. Ambos agentes instrumentan el mismo conjunto de bibliotecas; además, skywalking-go instrumenta el framework gRPC, mientras que Go2Sky no lo hace. Para consultar la lista de bibliotecas y los comandos de instalación de Go2Sky, véase Supported instrumentation libraries.
Obtención de un endpoint
Inicie sesión en la consola de ARMS. En el panel de navegación izquierdo, haga clic en Integration Center.
En la sección Server-side Applications, haga clic en la tarjeta SkyWalking.
-
En el panel SkyWalking que aparece, seleccione la región a la que desea reportar los datos.
Al acceder a una región por primera vez, los recursos se inicializan automáticamente.
-
Seleccione un Connection Type y copie el endpoint.
Si su servicio está desplegado en Alibaba Cloud dentro de la región seleccionada, elija la red VPC de Alibaba Cloud. De lo contrario, seleccione la red pública.

Reporte de datos con el agente skywalking-go (recomendado)
Paso 1: Descarga y compilación del agente
Descargue el agente skywalking-go y ejecute el siguiente comando para compilarlo:
cd skywalking-go && make build
Se genera un archivo ejecutable en el directorio skywalking-go/bin. El archivo ejecutable varía según el sistema operativo:
macOS:
skywalking-go-agent--darwin-amd64Linux:
skywalking-go-agent--linux-amd64Windows:
skywalking-go-agent--windows-amd64
Paso 2: Habilitación de la instrumentación en su proyecto de Go
Abra su proyecto de Go y habilite la instrumentación mediante uno de los siguientes métodos. Si el comando inject devuelve un error, importe el módulo skywalking en el paquete main.
Import the module in code (recommended)
Importe el módulo skywalking en el paquete main:
package main
import (
_ "github.com/apache/skywalking-go"
)
Inject the agent (no code changes)
Ejecute el archivo ejecutable con la bandera -inject:
skywalking-go/bin/skywalking-go-agent--darwin-amd64 -inject path/to/your-project
Paso 3: Configuración de los parámetros de conexión
Copie skywalking-go/tools/go-agent/config/config.default.yaml del repositorio skywalking-go descargado en el Paso 1, guárdelo como su propio archivo config.yaml y configure los siguientes parámetros para conectar el agente a Managed Service for OpenTelemetry:
agent:
service_name: ${SW_AGENT_NAME:<your-service-name>}
reporter:
grpc:
backend_service: ${SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE:<your-endpoint>}
authentication: ${SW_AGENT_REPORTER_GRPC_AUTHENTICATION:<your-auth-token>}
service_name: nombre del servicio. Reemplace<your-service-name>con el nombre de su aplicación.backend_service: endpoint. Reemplace<your-endpoint>con el endpoint que copió en Obtain an endpoint.authentication: token de autenticación del endpoint. Reemplace<your-auth-token>con su propio token.
Para consultar el resto de los parámetros del agente, las formas de configurarlos y el archivo de configuración predeterminado, véase Advanced configuration for the skywalking-go agent.
Paso 4: Recompilación e inicio del proyecto
Recompile su proyecto y pase el agente al compilador de Go mediante la bandera -toolexec:
# You must use -toolexec
sudo go build -toolexec "path/to/skywalking-go-agent -config path/to/config.yaml" -a
path/to/skywalking-go-agent: ruta absoluta del archivo ejecutable compilado en el Paso 1.path/to/config.yaml: ruta absoluta del archivo de configuración de parámetros del agente skywalking-go.
Inicie su proyecto. Los datos de SkyWalking se reportarán entonces a la consola de Managed Service for OpenTelemetry.
Reporte de datos con el agente Go2Sky (anterior)
Paso 1: Configuración de los parámetros de conexión
Go2Sky admite dos métodos de configuración: codificar los parámetros directamente en el proyecto o configurarlos automáticamente mediante variables de entorno.
Hard-code the parameters
Pase el endpoint y el token de autenticación obtenidos en Obtain an endpoint al reporter:
// Import parameters by using reporter.WithParameter()
report, err := reporter.NewGRPCReporter(
<your-backend-server-address>,
reporter.WithAuthentication(<your-auth-token>))
Automatic configuration with environment variables
Para consultar las variables de entorno que lee Go2Sky, véase Go2Sky environment variables. Puede configurar una variable de cualquiera de las siguientes maneras. El siguiente ejemplo utiliza macOS:
# Method 1: write to the environment variable configuration file (persistent)
vim ~/.bash_profile
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address>
source ~/.bash_profile
# Method 2: open a terminal and configure on the command line (temporary; no longer in effect in a new terminal)
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address>
Paso 2: Configuración del nombre del servicio
Configure ServiceName para identificar la aplicación:
ServiceName := <your-service-name>
tracer, err := go2sky.NewTracer(ServiceName, go2sky.WithReporter(report))
Paso 3: Adición de un hook de plugin de Go2Sky
Go2Sky proporciona plugins para diversas bibliotecas, pero debe agregar la instrumentación en el código fuente de su proyecto. Para obtener información sobre cómo añadir la instrumentación, consulte el repositorio Go2Sky-Plugins en GitHub. El archivo README.md en cada carpeta de plugin incluye un ejemplo básico de uso.
Para agregar el hook correspondiente al framework gin, realice las siguientes operaciones:
Vaya a la carpeta /gin y abra el archivo /gin/v3/README.md.
Agregue el hook de middleware:
v3.Middleware(r, tracer).
El siguiente ejemplo muestra cómo se monta el hook. Antes de reportar datos a Managed Service for OpenTelemetry, reemplace el reporter de registros por el reporter gRPC y el nombre del servicio que configuró en el Paso 1 y el Paso 2.
package main
import (
"log"
"github.com/SkyAPM/go2sky"
v3 "github.com/SkyAPM/go2sky-plugins/gin/v3"
"github.com/SkyAPM/go2sky/reporter"
"github.com/gin-gonic/gin"
)
func main() {
// Use gRPC reporter for production
re, err := reporter.NewLogReporter()
if err != nil {
log.Fatalf("new reporter error %v \n", err)
}
defer re.Close()
tracer, err := go2sky.NewTracer("gin-server", go2sky.WithReporter(re))
if err != nil {
log.Fatalf("create tracer error %v \n", err)
}
gin.SetMode(gin.ReleaseMode)
r := gin.New()
//Use go2sky middleware with tracing
r.Use(v3.Middleware(r, tracer))
// do something
}
Paso 4: Reinicio de la aplicación
Reinicie la aplicación.
Configuración avanzada del agente skywalking-go
Formas de establecer un parámetro
Puede establecer un parámetro del agente skywalking-go de dos maneras. El siguiente ejemplo configura service_name:
Method 1 (recommended): add the parameter to config.yaml
agent:
service_name: ${SW_AGENT_NAME:<your_service_name>}
Method 2: configure a system environment variable
export SW_AGENT_NAME=<your_service_name>
Exclusión de plugins
De forma predeterminada, el agente skywalking-go instrumenta todos los plugins automáticamente. Para excluir un plugin específico, configure el parámetro excluded:
# To exclude the sql plugin
plugin:
excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql}
# To exclude multiple plugins at the same time, separate them with commas
plugin:
excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql,gorm}
Archivo de configuración predeterminado
El siguiente ejemplo muestra el archivo completo config.default.yaml del agente skywalking-go:
agent:
# Service name is showed in UI.
service_name: ${SW_AGENT_NAME:Your_ApplicationName}
# To obtain the environment variable key for the instance name, if it cannot be obtained, an instance name will be automatically generated.
instance_env_name: SW_AGENT_INSTANCE_NAME
# Sampling rate of tracing data, which is a floating-point value that must be between 0 and 1.
sampler: ${SW_AGENT_SAMPLE:1}
meter:
# The interval of collecting metrics, in seconds.
collect_interval: ${SW_AGENT_METER_COLLECT_INTERVAL:20}
reporter:
grpc:
# The gRPC server address of the backend service.
backend_service: ${SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE:127.0.0.1:11800}
# The maximum count of segment for reporting tracing data.
max_send_queue: ${SW_AGENT_REPORTER_GRPC_MAX_SEND_QUEUE:5000}
# The interval(s) of checking service and backend service
check_interval: ${SW_AGENT_REPORTER_GRPC_CHECK_INTERVAL:20}
# The authentication string for communicate with backend.
authentication: ${SW_AGENT_REPORTER_GRPC_AUTHENTICATION:}
# The interval(s) of fetching dynamic configuration from backend.
cds_fetch_interval: ${SW_AGENT_REPORTER_GRPC_CDS_FETCH_INTERVAL:20}
tls:
# Whether to enable TLS with backend.
enable: ${SW_AGENT_REPORTER_GRPC_TLS_ENABLE:false}
# The file path of ca.crt. The config only works when opening the TLS switch.
ca_path: ${SW_AGENT_REPORTER_GRPC_TLS_CA_PATH:}
# The file path of client.pem. The config only works when mTLS.
client_key_path: ${SW_AGENT_REPORTER_GRPC_TLS_CLIENT_KEY_PATH:}
# The file path of client.crt. The config only works when mTLS.
client_cert_chain_path: ${SW_AGENT_REPORTER_GRPC_TLS_CLIENT_CERT_CHAIN_PATH:}
# Controls whether a client verifies the server's certificate chain and host name.
insecure_skip_verify: ${SW_AGENT_REPORTER_GRPC_TLS_INSECURE_SKIP_VERIFY:false}
log:
# The type determines which logging type is currently used by the system.
# The Go agent wourld use this log type to generate custom logs. It supports: "auto", "logrus", or "zap".
# auto: Automatically identifies the source of the log.
# If logrus is present in the project, it wourld automatically use logrus.
# If zap has been initialized in the project, it would use the zap framework.
# By default, it would use std errors to output log content.
# logrus: Specifies that the Agent should use the logrus framework.
# zap: Specifies that the Agent should use the zap framework.
# The system must have already been initialized through methods such as "zap.New", "zap.NewProduction", etc.
type: ${SW_AGENT_LOG_TYPE:auto}
tracing:
# Whether to automatically integrate Tracing information into the logs.
enable: ${SW_AGENT_LOG_TRACING_ENABLE:true}
# If tracing information is enabled, the tracing information would be stored in the current Key in each log.
key: ${SW_AGENT_LOG_TRACING_KEY:SW_CTX}
reporter:
# Whether to upload logs to the backend.
enable: ${SW_AGENT_LOG_REPORTER_ENABLE:true}
# The fields name list that needs to added to the label of the log.(multiple split by ",")
label_keys: ${SW_AGENT_LOG_REPORTER_LABEL_KEYS:}
plugin:
# List the names of excluded plugins, multiple plugin names should be splitted by ","
# NOTE: This parameter only takes effect during the compilation phase.
excluded: ${SW_AGENT_PLUGIN_EXCLUDES:}
config:
http:
# Collect the parameters of the HTTP request on the server side
server_collect_parameters: ${SW_AGENT_PLUGIN_CONFIG_HTTP_SERVER_COLLECT_PARAMETERS:false}
mongo:
# Collect the statement of the MongoDB request
collect_statement: ${SW_AGENT_PLUGIN_CONFIG_MONGO_COLLECT_STATEMENT:false}
sql:
# Collect the parameter of the SQL request
collect_parameter: ${SW_AGENT_PLUGIN_CONFIG_SQL_COLLECT_PARAMETER:false}
Variables de entorno
Variables de entorno de skywalking-go
La siguiente tabla enumera las variables de entorno compatibles con el agente skywalking-go. NULL indica que no se ha establecido ningún valor predeterminado.
|
Variable de entorno |
Descripción |
Valor predeterminado |
|
|
Nombre del servicio. |
NULL |
|
|
Nombre de la instancia del servicio. |
Generado automáticamente |
|
|
Tasa de muestreo. Valores válidos: 0 a 1. |
1 |
|
|
Endpoint del servidor al que se reportan los datos de monitoreo mediante gRPC. |
127.0.0.1:11800 |
|
|
Token de autenticación del servidor al que se reportan los datos de monitoreo mediante gRPC. |
NULL |
|
|
Plugins que se deben excluir. |
NULL |
Variables de entorno de Go2Sky
La siguiente tabla enumera las variables de entorno compatibles con el agente Go2Sky. NULL indica que no se ha establecido ningún valor predeterminado.
|
Variable de entorno |
Descripción |
Valor predeterminado |
|
|
Nombre del servicio de Go. |
NULL |
|
|
Nombre de la capa a la que pertenece la instancia, según la definición en el backend. |
NULL |
|
|
Nombre de la instancia del servicio de Go. |
Generado aleatoriamente |
|
|
Tasa de muestreo. Un valor de 1 indica recopilación completa. |
1 |
|
|
Dirección del servidor al que el agente reporta datos. |
NULL |
|
|
Token de autenticación del servidor al que el agente reporta datos. |
NULL |
|
|
Intervalo de reporte de latidos del agente, en segundos. |
20 |
|
|
Intervalo para obtener dinámicamente la configuración del agente, en segundos. |
20 |
|
|
Longitud del búfer de la cola que envía spans. |
30000 |
|
|
Habilita la función de hook de estado del proceso. |
False |
|
|
Etiquetas del proceso. Separe múltiples etiquetas con comas (,). |
NULL |
Bibliotecas de instrumentación compatibles
Tanto el agente skywalking-go como el agente Go2Sky instrumentan las siguientes bibliotecas. El agente skywalking-go las instrumenta automáticamente al compilar el proyecto y no requiere instalación. Para Go2Sky, ejecute el comando de instalación correspondiente a cada biblioteca que utilice su proyecto.
|
Biblioteca |
Comando de instalación de Go2Sky |
|
sql |
|
|
dubbo-go |
|
|
gear |
|
|
gin |
|
|
go-restful |
|
|
gorm |
|
|
http |
|
|
go-kratos v2 |
|
|
logrus |
|
|
go-micro (v3.5.0) |
|
|
mongo |
|
|
go-resty (v2.2.0) |
|
|
zap (v1.16.0) |
|
Preguntas frecuentes
El comando inject de skywalking-go devuelve un error de versión
Se produce el siguiente error al utilizar skywalking-go:
U-VF4VY9W5-1944:skywalking-go-test whlongxi$ skywalking-go/bin/skywalking-go-agent--darwin-amd64 -inject ../skywalking-go-test -all
2023/08/09 16:55:59 version is empty, please use the release version of skywalking-go
Si ocurre un error al usar el método inject, importe el módulo skywalking en el paquete main.
Las trazas entre procesos no se muestran correctamente al reportar datos mediante Go2Sky
El rastreo de extremo a extremo vincula una traza mediante el ID de traza, el cual se transporta en las solicitudes HTTP. Una traza incorrecta significa que el ID de traza no se propagó adecuadamente, por lo que debe configurar los spans correctamente. Utilice las siguientes dos interfaces para vincular llamadas entre procesos en una sola traza:
CreateEntrySpan: span de entrada. Utilice esta interfaz para extraer el contexto de rastreo, que incluye el ID de traza, de una solicitud HTTP.CreateExitSpan: span de salida. Utilice esta interfaz para inyectar el contexto de rastreo, que incluye el ID de traza, en una solicitud HTTP.
// Within a process, use CreateLocalSpan to create a span.
span, ctx, err := tracer.CreateLocalSpan(context.Background())
subSpan, newCtx, err := tracer.CreateLocalSpan(ctx)
// Across processes, use the entry span CreateEntrySpan to extract the context from the HTTP request, and use the exit span CreateExitSpan to inject the context into the HTTP request.
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/login", func(key string) (string, error) {
return r.Header.Get(key), nil
})
span, err := tracer.CreateExitSpan(req.Context(), "/service/validate", "tomcat-service:8080", func(key, value string) error {
req.Header.Set(key, value)
return nil
})
En un proyecto entre procesos, el ID de traza debe propagarse entre los procesos para mantener la continuidad de la traza. Utilice las interfaces anteriores para inyectar el contexto en las solicitudes HTTP, de modo que se transmita entre procesos junto con dichas solicitudes.
Referencias
Demostración de SkyWalking: repositorio de demostración de ejemplo para este tema.