Directorio de artículos
1. Introducción
Skywalking es un excelente marco nacional de código abierto, que fue abierto por Wu Sheng (desarrollador de Huawei) en 2015 y se unió a la incubadora Apache en 2017. En apenas dos años fue contratado por Apache, lo que demuestra su fortaleza. Skywalking admite la integración de Dubbo, SpringCloud, SpringBoot, el código no es intrusivo, el método de comunicación usa GRPC y el rendimiento es bueno. El método de implementación es la sonda Java, admite alarmas, admite monitoreo JVM, admite estadísticas de llamadas globales, etc. y tiene funciones relativamente completas.
Sitio web oficial: https://skywalking.apache.org/
Arquitectura de Skywalking
SkyWalking se divide lógicamente en cuatro partes: sonda, plataforma backend, almacenamiento e interfaz de usuario.
- Las sondas pueden ser diferentes según diferentes fuentes, pero su función es recopilar datos y formatearlos en un formato adecuado para SkyWalking;
- El backend de la plataforma admite la agregación de datos, el análisis de datos y los procesos que impulsan el flujo de datos desde las sondas hasta las interfaces de usuario. El análisis incluye indicadores de rendimiento y seguimiento nativos de Skywalking, así como fuentes de terceros, incluida la telemetría de Istio y Envoy, el formato de seguimiento Zipkin, etc.;
- El almacenamiento almacena los datos de SkyWalking a través de una interfaz de complemento abierta. Puede elegir un sistema de almacenamiento existente, como ElasticSearch, H2 o MySQL cluster (administración de Sharding-Sphere), o puede optar por implementar un sistema de almacenamiento usted mismo. Por supuesto, nosotros son bienvenidos. Usted contribuye con nuevas implementaciones de sistemas de almacenamiento;
- UI es un sistema web altamente personalizado basado en la interfaz, que permite a los usuarios ver y administrar visualmente los datos de SkyWalking.
2. Docker-compose implementa el skywalking
Aprenda a utilizar Docker-compose usted mismo y no entrará en detalles aquí. El archivo docker-compose.yml es el siguiente:
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.6
container_name: elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- TZ=Asia/Shanghai
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
volumes:
- /skywalking/elasticsearch/data:/usr/share/elasticsearch/data
ulimits:
memlock:
soft: -1
hard: -1
oap:
image: docker.io/apache/skywalking-oap-server:9.4.0
container_name: oap
depends_on:
- elasticsearch
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_CORE_RECORD_DATA_TTL: 15
SW_CORE_METRICS_DATA_TTL: 15
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
SW_ENABLE_UPDATE_UI_TEMPLATE: true
TZ: Asia/Shanghai
JAVA_OPTS: "-Xms2048m -Xmx2048m"
ui:
image: docker.io/apache/skywalking-ui:9.4.0
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: http://oap:12800
SW_ZIPKIN_ADDRESS: http://oap:9412
Después de la ejecución normal, tardará aproximadamente 1 minuto en esperar. Ingrese http://IP:8080 en el navegador y verá la siguiente interfaz. No hay datos cuando recién se inicia (no es necesario iniciar sesión). No hay trampas en todo el proceso, sólo una vez.
El uso de la interfaz de usuario se presentará más adelante.
3. springboot integra skywalking
Prepare un proyecto web springboot simple.
1. Descargue el agente de descompresión.
注意:agent版本和oap版本需要适配,版本不适配可能会出现页面无法访问、agent上报不到页面等问题。
Dirección de descarga : https://skywalking.apache.org/downloads/
La versión de Skywalking utilizada por el autor es 9.4.0. No hay problema en descargar la versión v8.16.0 del cliente, está disponible para pruebas personales.
La estructura del código se muestra a continuación:
Debe configurar el archivo de configuración config/agent.config en la carpeta skywalking-agent. Se enumeran las dos configuraciones más críticas. Puede explorar otras configuraciones usted mismo.
agent.service_name=${
SW_AGENT_NAME:HS}
collector.backend_service=${
SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.54.53:11800}
2. Atraque de troncos
Hay un módulo de registro en el lado de la interfaz de usuario de Skywalking, que se utiliza para recopilar registros de clientes. De forma predeterminada, no hay datos. Entonces, ¿cómo transferir los datos de registro a Skywalking?
Skywalking admite los siguientes métodos de acceso a registros.
Usemos el inicio de sesión predeterminado de Springboot como ejemplo para presentar cómo configurarlo.
(1) Introducir dependencias
<!--打印skywalking的TraceId到日志-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.12.0</version>
</dependency>
(2) Agregar archivo de configuración
Cree un nuevo logback-spring.xml y colóquelo en el directorio de recursos. La configuración es la siguiente:
<configuration debug="false" scan="false">
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
<property name="log.path" value="logs/${spring.application.name}"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<appender name="grpc" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!--nacos 心跳 INFO 屏蔽-->
<logger name="com.alibaba.nacos" level="OFF">
<appender-ref ref="error"/>
</logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<!-- <appender-ref ref="console"/>-->
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
<appender-ref ref="stdout"/>
<appender-ref ref="grpc"/>
</root>
</configuration>
(3) Agregar registros al código
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ApiOperation(value = "测试")
public ModelMap test(){
ModelMap modelMap = new ModelMap();
modelMap.addAttribute("code", "success");
log.info(modelMap.toString());
return modelMap;
}
3. Comience a usar el modo sonda
(1) Comience con una idea
Configurar las opciones de VM
El parámetro de configuración javaagent es la ruta absoluta de skywalking-agent.
-javaagent:D:\code\test\HS\src\main\skywalking-agent\skywalking-agent.jar
Iniciar proyecto
Verá que ya hay registros en Skywalking, que son consistentes con los registros en la consola de ideas.
(2) Comience a usar el frasco
Como idea, simplemente configure las opciones de VM al inicio
java -javaagent:D:\code\test\HS\src\main\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=HS -Dskywalking.collector.backend_service=192.168.54.53:11800 -jar app.jar
(3) Verificación de interfaz
Llamar a la interfaz web
4. Resumen
Durante el proceso de integración de Skywalking y Springboot, básicamente no hubo obstáculos, todo el proceso fue relativamente sencillo y, de hecho, fue un proyecto de depósito de Apache. El proceso está registrado, espero que pueda ayudarte. El próximo artículo presenta principalmente la integración de Skywalking y Apisix, ¡así que estad atentos!
Terminó la obra.