Introducción a la herramienta de seguimiento de enlaces completo SkyWalking

 

Tabla de contenido

Prefacio

Introducción a SkyWalking

Arquitectura

Empezando

1. Descarga

2. Configure la sonda

3. Configure los parámetros de la aplicación que necesita ser monitoreada.

4. Configurar skyWalking

5. Inicie skyWalking

6. Ver servicio

7. La interfaz sw-web no muestra datos.

Tecnología de sonda

1. Introducción a javaAgent

2. Uso de javaAgent


Prefacio

A medida que el negocio se vuelve cada vez más complejo, las aplicaciones empresariales también han entrado en la etapa de servicios distribuidos. El monitoreo de registros tradicional y otros métodos no pueden cumplir bien los requisitos de seguimiento de llamadas y solución de problemas. Esto es una cortesía. Nuestro punto débil más común es la optimización del rendimiento. Necesitamos encontrar código problemático durante la optimización. He introducido el uso de Arthas para solucionar problemas o encontrar código que requiere mucho tiempo, pero esta herramienta es un nodo único después de todo y encuentra Reflexión A veces no se puede mostrar y el efecto es limitado. En este momento, se necesita una herramienta de seguimiento de enlace completo. Las más utilizadas son SkyWalking y Pinpoint.

 

Introducción a SkyWalking

SkyWalking es un sistema APM (Application Performance Monitoring) para sistemas distribuidos, especialmente para microservicios, arquitecturas nativas en la nube y en contenedores, cuyo núcleo es un sistema de seguimiento distribuido. Recoge automáticamente los indicadores requeridos a través de sondas y se basa en tecnología de sonda con cero intrusión y cero acoplamiento a la aplicación. A través de estos indicadores y enlaces de llamada, SkyWalking APM percibirá la relación entre las aplicaciones y los servicios y realizará las estadísticas de los indicadores correspondientes.

 

Arquitectura

El diagrama de arquitectura es el siguiente:

En términos generales, se puede dividir a grandes rasgos en tres partes:

  • recopilador (recopilador): recopilador de datos de enlace, los datos se pueden descargar en ElasticSearch, el modo independiente también puede aterrizar en H2, no recomendado, H2 solo se usa para una demostración temporal
  • agente (sonda): se utiliza para recopilar y enviar datos al recopilador
  • web: plataforma de visualización web, utilizada para mostrar los datos desembarcados

 

Empezando

1. Descarga

Puede ir al sitio web oficial para descargar: http://skywalking.apache.org/zh/downloads/ , mac descargar el paquete tar en linux y descomprimirlo. La versión descargada aquí es la versión 6.6.0. La lista descomprimida es como sigue:

2. Configure la sonda

Vaya a agent / config /, busque el archivo de configuración agent.config, hay dos lugares que deben configurarse:

# 在web界面中展示的服务名
agent.service_name=${SW_AGENT_NAME:xxx}

# skyWalking服务所在地址,即该工具在哪里启动的,端口号不用改
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}

3. Configure los parámetros de la aplicación que necesita ser monitoreada.

Tome la secuencia de comandos de inicio con el proyecto como ejemplo, simplemente agregue la siguiente configuración directamente a los parámetros de inicio:

-javaagent:/xxx/agent/skywalking-agent.jar -Dskywalking_config=/xxx/agent/ticket/agent.config

La segunda mitad, por supuesto, también se puede utilizar directamente sin especificar el archivo de configuración.

-Dskywalking.agent.service_name=itsm-web -Dskywalking.collector.backend_service=10.1.61.165:11800

El servidor donde se encuentra skyWalking se puede separar de la máquina configurada por la sonda específica. Si está separado, toda la carpeta del agente debe moverse a la máquina donde la sonda está configurada específicamente, como / agent anterior. Tenga en cuenta que / xxx aquí está la ruta completa. El siguiente / ticket / xxx es el archivo de configuración del microservicio correspondiente. Debido a que es un servicio distribuido, debe configurarse por separado

skywalking admite lo siguiente

4. Configurar skyWalking

Se puede configurar si es necesario. Si no hay ningún requisito especial, puede pasar directamente. El archivo de configuración se encuentra en /config/application.yml, que se puede dividir aproximadamente en tres categorías:

  1. núcleo: configuración relacionada con el recopilador, compatible con la colección http / gRPC
  2. almacenamiento: recopile almacenamiento de datos, soporte H2 y ES
  3. receptor: puede recopilar información, información relacionada con la ejecución de jvm, registro de seguimiento de zipkin, etc.

Para la depuración temporal, puede usar directamente H2 para almacenar datos de monitoreo. Este también es el almacenamiento de datos predeterminado de skyWalking. Generalmente, se requiere almacenamiento persistente en línea, que se puede cambiar a almacenamiento ES. Si el puerto 8080 de la interfaz skyWalking-web entra en conflicto, es posible que se informe de un error, puede ir a /webapp/webapp.yml para modificar

5. Inicie skyWalking

Simplemente ejecute startup.sh en bin. Después de la ejecución, se iniciarán los siguientes dos servicios:

  1. Skywalking-Collector: recopilador de información de seguimiento que recopila información recopilada del lado del cliente a través de gRPC / Http. El puerto predeterminado para Http es 12800 y el puerto predeterminado para gRPC es 11800.
  2. Skywalking-Webapp: el puerto predeterminado de la página de la plataforma de administración es 8080 y la información de inicio de sesión es admin / admin

6. Ver servicio

Visite la dirección donde se encuentra su skyWalking, como localhost: 8080, si ve la siguiente interfaz, significa que el inicio fue exitoso

Entonces puede usarlo usted mismo. El más utilizado es la columna de seguimiento, es decir, puede ver toda la cadena de llamadas y el tiempo que lleva entre servicios de un vistazo. Al mismo tiempo, también puede ver la información de gc en la instancia del panel. Usted mismo puede descubrir más funciones y no hay captura de pantalla aquí.

7. La interfaz sw-web no muestra datos.

Una vez configurado e iniciado el proyecto, la interfaz web de sw mostrará el servicio correspondiente después de acceder a la interfaz del proyecto. Si todavía no hay datos en la interfaz web en este momento, ¡active la actualización automática! ! ! (Me enfrenté una vez antes)

 

Tecnología de sonda

skyWalking se basa en la tecnología de sonda para realizar el seguimiento de enlaces La sonda es implementada por Byte Buddy (el otro es Javassist), una de las dos herramientas de manipulación de código de bytes de javaAgent. Aquí hay un registro simple del conocimiento de los agentes java:

1. Introducción a javaAgent

javaAgent es una nueva característica introducida después de jdk1.5. Esta característica proporciona a los usuarios JVM después de leer un archivo de código de bytes en la memoria, y antes de que JVM use el flujo de bytes correspondiente para generar un objeto de clase en el montón, el usuario puede modificar el El archivo de código de bytes también usará el archivo de código de bytes modificado para generar objetos de clase. Esta característica es un poco como AOP a nivel de máquina virtual . Los desarrolladores pueden implementar ciertas funciones de AOP sin ninguna actualización ni cambios en el jdk.

El agente java es un parámetro del comando java. El parámetro javaagent se puede utilizar para especificar un paquete jar. Al mismo tiempo, existen dos requisitos para el paquete jar:

  • El archivo MANIFEST.MF de este paquete jar debe especificar el elemento Premain-Class.
  • La clase especificada por Premain-Class debe implementar el método premain ().

La atención se centra en el método premain, que literalmente significa el método ejecutado antes que el método principal. Cuando se inicia la máquina virtual java, antes de ejecutar el método principal, jvm primero ejecutará el método premain () de la clase Premain-Class en el paquete jar especificado por el parámetro -javaagent. La firma del método es la siguiente:

  • public static void premain (String agentArgs, Instrumentation inst)
  • public static void premain (String agentArgs)

Y la prioridad del método 1 es mayor que el método 2, es decir, jvm seleccionará el método 1 para la ejecución primero, agentArgs es la cadena yyy pasada en el siguiente javaagent: xx.jar = yyy, la instrumentación es una instancia de java.lang.instrument .Instrumentación, se crea una instancia mediante métodos locales y jvm la pasa automáticamente. Esta clase es la clase principal de javaAgent.

2. Uso de javaAgent

Para usar javaAgent, hay dos puntos principales. Escriba el archivo MANIFEST.MF (el archivo está en el directorio META-INF) para especificar la clase de entrada del Agente, y escriba la clase de entrada e implemente el método premain al mismo tiempo. . Cree un nuevo proyecto de maven y escriba la clase de entrada de la siguiente manera:

public class PremainTest {

    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("agentArgs : " + agentArgs);
        // 可以通过实现ClassFileTransformer来完成我们所希望的类字节码转换
        inst.addTransformer(new ClassFileTransformer() {
            @Override
            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
                                    ProtectionDomain protectionDomain, byte[] classfileBuffer)
                    throws IllegalClassFormatException {
                System.out.println("premain load Class     :" + className);
                return classfileBuffer;
            }
        }, true);

    }
}

Luego use el complemento de maven para generar MANIFEST.MF. Si lo escribe usted mismo, se sobrescribirá cuando finalmente esté empaquetado, por lo que sigue siendo el complemento más confiable. La parte del pom:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <!--自动添加META-INF/MANIFEST.MF -->
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <Premain-Class>demo.PremainTest</Premain-Class>
                            <Agent-Class>demo.PremainTest</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

Luego empaquete el proyecto anterior para obtener el paquete jar correspondiente. Después de la descompresión, el archivo MANIFEST.MF es el siguiente, puede ver que el elemento Premain-Class está correctamente especificado

Manifest-Version: 1.0
Premain-Class: demo.PremainTest
Built-By: xujia
Agent-Class: demo.PremainTest
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Created-By: Apache Maven 3.5.4
Build-Jdk: 1.8.0_172

Finalmente, simplemente escriba una clase de prueba de la siguiente manera, y luego use el parámetro javaagent para iniciar el método de prueba del agente

public class AgentTest {

    public static void main(String[] args) {
        System.out.println("This is main method ~");
    }
}

-javaagent puede especificar varios paquetes jar, el orden de carga es de adelante hacia atrás, y cada -javaagent es independiente y tiene sus propios agentes y datos de agentes.

Con respecto al conversor de clases anterior ClassFileTransformer, su función es leer el archivo de código de bytes de una determinada clase en la memoria, pero antes de generar el objeto de clase de la clase, el jvm atravesará todas las instancias de instrumentación y las ejecutará todas. En cuanto a los parámetros de este método, los puntos clave a tener en cuenta son:

  • className: el nombre de clase calificado de la clase actual
  • classfileBuffer: Los datos de código de bytes de la clase actual presentados en una matriz de bytes (pueden ser inconsistentes con los datos del archivo de clase, porque los datos de bytes aquí son los últimos datos de código de bytes de este tipo, es decir, estos datos pueden ser el código de bytes original datos Nuevos datos después de otros métodos de mejora)

Supongo que te gusta

Origin blog.csdn.net/m0_38001814/article/details/104061708
Recomendado
Clasificación