Exporte los datos de observability desde una aplicación Java hacia Cloud Database ClickHouse Enterprise Edition y analícelos mediante el servicio ClickStack para supervisar el rendimiento de la aplicación en tiempo real y resolver incidencias con mayor rapidez.
Requisitos previos
Su instancia de Alibaba Cloud ClickHouse Enterprise Edition debe tener habilitado ClickStack service.
Procedimiento
En este ejemplo se despliegan el servicio empresarial y OpenTelemetry Collector en la misma instancia de ECS. Para entornos de producción, se recomienda desplegar el servicio empresarial y OpenTelemetry Collector por separado.
Paso 1: Desplegar OpenTelemetry Collector
-
Configure la instancia de ECS.
Purchase an ECS instance. Se recomienda asignar una dirección IP pública durante la compra para permitir el acceso desde la red pública.
-
Agregue la dirección IP de la instancia de ECS a la allowlist de Alibaba Cloud ClickHouse.
Dirección IP privada: si la instancia de ECS y la instancia de Alibaba Cloud ClickHouse Enterprise Edition se encuentran en la misma Virtual Private Cloud (VPC), agregue la dirección IP privada de la instancia de ECS a la lista de permitidos. En este caso, utilice el endpoint de VPC para la instancia de Alibaba Cloud ClickHouse en los pasos siguientes.
Dirección IP pública: si la instancia de ECS no puede conectarse a la instancia de Alibaba Cloud ClickHouse Enterprise Edition a través de la red privada, agregue la dirección IP pública de la instancia de ECS a la lista de permitidos. En este caso, utilice el endpoint público para la instancia de Alibaba Cloud ClickHouse en los pasos siguientes.
Puede connect to the ECS instance y ejecutar el siguiente comando para probar la conexión a la instancia de Alibaba Cloud ClickHouse. Una respuesta
Ok.indica que la conexión fue exitosa.curl http://cc-xxxxxxx-clickhouse.clickhouseserver.pre.rds.aliyuncs.com:8123
-
Connect to the ECS instance y ejecute los siguientes comandos para instalar otelcol-contrib.
mkdir llm-demo cd llm-demo wget -O otelcol-contrib.rpm https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.136.0/otelcol-contrib_0.136.0_linux_amd64.rpm yum install otelcol-contrib.rpm -
Configure OpenTelemetry Collector para recibir datos de observability mediante gRPC y HTTP, y enviarlos a la instancia de Alibaba Cloud ClickHouse a través de HTTP.
Copie el siguiente comando y modifique la configuración según se describe:
En la sección
receivers, se recomienda reemplazar elendpointdel receptor OTLP por el endpoint de su servicio OpenTelemetry Collector.-
En la sección
exporters:Configure los detalles de conexión de su instancia de Alibaba Cloud ClickHouse, incluidos
endpoint,usernameypassword.Configure los nombres de la base de datos y las tablas donde se almacenarán los datos de observability en su instancia de Alibaba Cloud ClickHouse. Esto incluye
database,traces_table_name,logs_table_nameymetrics_tables.
cat > /etc/otelcol-contrib/config.yaml << EOF receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 processors: batch: timeout: 5s send_batch_size: 5000 exporters: clickhouse: endpoint: http://cc-xxxxxx-clickhouse.clickhouseserver.pre.rds.aliyuncs.com:8123?dial_timeout=10s&compress=lz4&async_insert=1 username: test password: password # ttl: 72h traces_table_name: otel_traces logs_table_name: otel_logs metrics_tables: gauge: name: otel_metrics_gauge sum: name: otel_metrics_sum summary: name: otel_metrics_summary histogram: name: otel_metrics_histogram exponential_histogram: name: otel_metrics_exp_histogram create_schema: false timeout: 5s database: clickobserve_service sending_queue: queue_size: 1000 retry_on_failure: enabled: true initial_interval: 5s max_interval: 30s max_elapsed_time: 300s service: pipelines: traces: receivers: [otlp] processors: [batch] exporters: [clickhouse] metrics: receivers: [otlp] processors: [batch] exporters: [clickhouse] logs: receivers: [otlp] processors: [batch] exporters: [clickhouse] EOF -
Inicie OpenTelemetry Collector.
service otelcol-contrib restart
Paso 2: Crear una aplicación Java
Esta sección utiliza como ejemplo un servicio sencillo de lanzamiento de dados basado en Spring Boot.
-
Configure el entorno de Java.
Deploy a Java environment. Se recomienda instalar Java 17 o una versión posterior.
Descargue e instale Gradle. Se recomienda instalar Gradle 8 o una versión posterior.
-
Inicialice un proyecto de Gradle.
En este ejemplo, el directorio se denomina
java-simple. Después de la inicialización, la estructura del directorio es la siguiente:java-simple ├── app │ ├── build.gradle.kts │ └── src │ ├── main │ │ ├── java │ │ │ └── org │ │ │ └── example │ │ │ └── App.java │ │ └── resources │ └── test │ ├── java │ │ └── org │ │ └── example │ │ └── AppTest.java │ └── resources ├── gradle │ ├── libs.versions.toml │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle.kts -
En el directorio
java-simple, modifique o cree los siguientes archivos:build.gradle.kts
plugins { id("java") id("org.springframework.boot") version "3.0.6" id("io.spring.dependency-management") version "1.1.0" } sourceSets { main { java.setSrcDirs(setOf(".")) } } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-web") }App.java
package org.example; import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App { public static void main(String[] args) { SpringApplication app = new SpringApplication(App.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); } }RollController.java
package org.example; import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class RollController { private static final Logger logger = LoggerFactory.getLogger(RollController.class); @GetMapping("/rolldice") public String index(@RequestParam("player") Optional<String> player) { int result = this.getRandomNumber(1, 6); if (player.isPresent()) { logger.info("{} is rolling the dice: {}", player.get(), result); } else { logger.info("Anonymous player is rolling the dice: {}", result); } return Integer.toString(result); } public int getRandomNumber(int min, int max) { return ThreadLocalRandom.current().nextInt(min, max + 1); } }
Paso 3: Configurar OpenTelemetry Java Agent
-
Descargue OpenTelemetry Java Agent.
curl -L -O https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar -
Configure las variables de entorno.
export JAVA_TOOL_OPTIONS="-javaagent:/../opentelemetry-javaagent.jar" \ OTEL_TRACES_EXPORTER=otlp \ OTEL_METRICS_EXPORTER=otlp \ OTEL_LOGS_EXPORTER=otlp \ OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ OTEL_EXPORTER_OTLP_ENDPOINT=http://<IP_ADDRESS>:4318 \ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://<IP_ADDRESS>:4318/v1/traces \ OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://<IP_ADDRESS>:4318/v1/metrics \ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://<IP_ADDRESS>:4318/v1/logs \ OTEL_METRIC_EXPORT_INTERVAL=15000JAVA_TOOL_OPTIONS: establezca esta variable con la ruta real del archivoopentelemetry-javaagent.jar.Configuraciones de endpoint: en
http://<IP_ADDRESS>:4318, reemplace<IP_ADDRESS>por la dirección IP del endpoint del servicio Otel Collector al que su aplicación Java pueda acceder.Para obtener información sobre otros parámetros, consulte properties-exporters.
Paso 4: Iniciar y acceder a la aplicación Java
-
En el directorio de la aplicación del proyecto, ejecute los siguientes comandos para iniciar la aplicación.
En este ejemplo, el directorio de la aplicación del proyecto es
../java-simple/app.gradle assemble java -jar ./build/libs/app.jar -
En su navegador, acceda a
http://<IP_ADDRESS>:8080/rolldice. Reemplace<IP_ADDRESS>por la dirección IP del servidor donde se ejecuta la aplicación Java.Tras una solicitud exitosa, la página devuelve un número aleatorio, como se muestra en el siguiente ejemplo:
5
Paso 5: Consultar y analizar los datos de observability
En el panel de navegación izquierdo de la página de detalles de la instancia de Cloud Database ClickHouse, haga clic en ClickStack y siga las instrucciones en pantalla para abrir el portal del servicio.
-
En la página principal, consulte y analice los datos de observability de su aplicación Java.
En la página Search de HyperDX, configure el origen de datos como otel_traces. Introduzca la consulta SQL
SELECT Timestamp, ServiceName as service, StatusCode as level, round(Duration / 1e6) as duration, SpanNamey establezca el orden de clasificación como Timestamp DESC. En el panel izquierdo Filters, filtre por SpanName (por ejemplo,GET /rolldiceoPUBLISH) y por ServiceName (por ejemplo,appolanggenius/dify). La tabla de resultados, que incluye columnas como Timestamp, service, level, duration y SpanName, muestra los detalles de latencia de los spans entre servicios.