From bf5e06d70941379c20001dd2704d3dfe22244d4a Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Mon, 14 Apr 2025 00:24:57 +0700 Subject: [PATCH] feat: use tjahzi for simpler appender --- loki/alloy/config.yaml | 59 --- loki/build.gradle.kts | 12 +- loki/docker-compose.yml | 75 +-- .../provisioning/dashboards/dashboards.yml | 11 - .../dashboards/logs-dashboard.json | 486 ------------------ .../provisioning/datasources/datasource.yml | 12 - .../java/com/miti99/loki/LogGenerator.java | 116 +++++ .../java/com/miti99/loki/LoggingExample.java | 104 ---- loki/src/main/java/com/miti99/loki/Main.java | 94 +--- loki/src/main/resources/log4j2.xml | 26 +- .../main/resources/otel-collector-config.yaml | 44 -- 11 files changed, 180 insertions(+), 859 deletions(-) delete mode 100644 loki/alloy/config.yaml delete mode 100644 loki/grafana/provisioning/dashboards/dashboards.yml delete mode 100644 loki/grafana/provisioning/dashboards/logs-dashboard.json delete mode 100644 loki/grafana/provisioning/datasources/datasource.yml create mode 100644 loki/src/main/java/com/miti99/loki/LogGenerator.java delete mode 100644 loki/src/main/java/com/miti99/loki/LoggingExample.java delete mode 100644 loki/src/main/resources/otel-collector-config.yaml diff --git a/loki/alloy/config.yaml b/loki/alloy/config.yaml deleted file mode 100644 index 47f8b1f..0000000 --- a/loki/alloy/config.yaml +++ /dev/null @@ -1,59 +0,0 @@ -version: '1' - -server: - log_level: info - grpc: - listen_address: 0.0.0.0:4317 - http: - listen_address: 0.0.0.0:4318 - prometheus: - listen_address: 0.0.0.0:9090 - -pipelines: - logs: - - name: otlp_to_loki - receivers: - - otlp - processors: - - batch - - resourceattributes - - attributes - exporters: - - loki - -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - -processors: - batch: - timeout: 1s - max_batch_size: 1000 - - resourceattributes: - actions: - - key: service.name - action: upsert - value: "opentelemetry-log4j2-alloy" - - attributes: - actions: - - key: loki.attribute.labels - action: upsert - value: "service.name,service.version,log.level,severity" - -exporters: - loki: - endpoint: http://loki:3100/loki/api/v1/push - tenant_id: "alloy" - labels: - resource: - service.name: "service_name" - service.version: "service_version" - record: - severity: "severity" - log.level: "log_level" diff --git a/loki/build.gradle.kts b/loki/build.gradle.kts index 2c1c16c..3cd21c0 100644 --- a/loki/build.gradle.kts +++ b/loki/build.gradle.kts @@ -12,19 +12,9 @@ repositories { dependencies { annotationProcessor("org.projectlombok:lombok:1.18.30") - implementation("io.opentelemetry:opentelemetry-api:1.33.0") - implementation("io.opentelemetry:opentelemetry-sdk:1.33.0") - implementation("io.opentelemetry:opentelemetry-sdk-logs:1.33.0") - implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.33.0") - implementation("io.opentelemetry.instrumentation:opentelemetry-log4j-appender-2.17:1.30.0-alpha") - implementation("io.opentelemetry.proto:opentelemetry-proto:1.0.0-alpha") - implementation("org.projectlombok:lombok:1.18.30") - implementation("org.apache.logging.log4j:log4j-api:2.20.0") - implementation("org.apache.logging.log4j:log4j-core:2.20.0") - implementation("org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0") - + implementation("pl.tkowalcz.tjahzi:log4j2-appender:0.9.17") testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") diff --git a/loki/docker-compose.yml b/loki/docker-compose.yml index b380343..c36314c 100644 --- a/loki/docker-compose.yml +++ b/loki/docker-compose.yml @@ -1,49 +1,52 @@ -version: '3' +version: "3.3" + +networks: + loki: services: - # Alloy (OpenTelemetry Collector) - alloy: - image: otel/opentelemetry-collector:latest - container_name: alloy - command: [ "--config=/etc/alloy/config.yaml" ] - volumes: - - ./alloy/config.yaml:/etc/alloy/config.yaml - ports: - - "4317:4317" # OTLP gRPC - - "4318:4318" # OTLP HTTP - - "9090:9090" # Prometheus metrics - depends_on: - - loki - networks: - - otel-network - - # Loki (Log Storage) loki: - image: grafana/loki:2.9.2 - container_name: loki + image: grafana/loki:latest ports: - "3100:3100" command: -config.file=/etc/loki/local-config.yaml networks: - - otel-network + - loki + + promtail: + image: grafana/promtail:latest + volumes: + - /var/log:/var/log + command: -config.file=/etc/promtail/config.yml + networks: + - loki - # Grafana (Visualization) grafana: - image: grafana/grafana:10.1.0 - container_name: grafana - ports: - - "3000:3000" environment: + - GF_PATHS_PROVISIONING=/etc/grafana/provisioning - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_AUTH_DISABLE_LOGIN_FORM=true - volumes: - - ./grafana/provisioning:/etc/grafana/provisioning - depends_on: - - loki + - GF_FEATURE_TOGGLES_ENABLE=alertingSimplifiedRouting,alertingQueryAndExpressionsStepMode + entrypoint: + - sh + - -euc + - | + mkdir -p /etc/grafana/provisioning/datasources + cat < /etc/grafana/provisioning/datasources/ds.yaml + apiVersion: 1 + datasources: + - name: Loki + type: loki + access: proxy + orgId: 1 + url: http://loki:3100 + basicAuth: false + isDefault: true + version: 1 + editable: false + EOF + /run.sh + image: grafana/grafana:latest + ports: + - "3000:3000" networks: - - otel-network - -networks: - otel-network: - driver: bridge + - loki diff --git a/loki/grafana/provisioning/dashboards/dashboards.yml b/loki/grafana/provisioning/dashboards/dashboards.yml deleted file mode 100644 index dd8cc78..0000000 --- a/loki/grafana/provisioning/dashboards/dashboards.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: 1 - -providers: - - name: 'Logs Dashboard' - orgId: 1 - folder: '' - type: file - disableDeletion: false - editable: true - options: - path: /etc/grafana/provisioning/dashboards diff --git a/loki/grafana/provisioning/dashboards/logs-dashboard.json b/loki/grafana/provisioning/dashboards/logs-dashboard.json deleted file mode 100644 index 733a07b..0000000 --- a/loki/grafana/provisioning/dashboards/logs-dashboard.json +++ /dev/null @@ -1,486 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 1, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showCommonLabels": false, - "showLabels": false, - "showTime": true, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "editorMode": "builder", - "expr": "{service_name=\"opentelemetry-log4j2-alloy\"}", - "queryType": "range", - "refId": "A" - } - ], - "title": "All Logs", - "type": "logs" - }, - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "description": "Log count by severity level", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0.5, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "ERROR" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "WARN" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "INFO" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "DEBUG" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "green", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "editorMode": "builder", - "expr": "sum by(severity) (count_over_time({service_name=\"opentelemetry-log4j2-alloy\"} | unwrap severity [$__interval]))", - "legendFormat": "{{severity}}", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Count by Severity", - "type": "timeseries" - }, - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 3, - "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showCommonLabels": false, - "showLabels": false, - "showTime": true, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "editorMode": "builder", - "expr": "{service_name=\"opentelemetry-log4j2-alloy\"} |= `error` or |= `exception`", - "queryType": "range", - "refId": "A" - } - ], - "title": "Errors and Exceptions", - "type": "logs" - }, - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 5 - }, - { - "color": "red", - "value": 10 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 16 - }, - "id": 4, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "sum" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.0", - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "editorMode": "builder", - "expr": "sum(count_over_time({service_name=\"opentelemetry-log4j2-alloy\", severity=\"ERROR\"} [$__range]))", - "queryType": "instant", - "refId": "A" - } - ], - "title": "Total Errors", - "type": "stat" - }, - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 16 - }, - "id": 5, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "sum" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.1.0", - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "editorMode": "builder", - "expr": "sum(count_over_time({service_name=\"opentelemetry-log4j2-alloy\"} [$__range]))", - "queryType": "instant", - "refId": "A" - } - ], - "title": "Total Logs", - "type": "stat" - }, - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1, - "scaleDistribution": { - "type": "linear" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 16 - }, - "id": 6, - "options": { - "barRadius": 0, - "barWidth": 0.97, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "orientation": "auto", - "showValue": "auto", - "stacking": "none", - "tooltip": { - "mode": "single", - "sort": "none" - }, - "xTickLabelRotation": 0, - "xTickLabelSpacing": 0 - }, - "pluginVersion": "10.1.0", - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "P8E80F9AEF21F6940" - }, - "editorMode": "builder", - "expr": "sum by(severity) (count_over_time({service_name=\"opentelemetry-log4j2-alloy\"} | unwrap severity [$__range]))", - "legendFormat": "{{severity}}", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Distribution", - "type": "barchart" - } - ], - "refresh": "", - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "OpenTelemetry Log4j2 Dashboard", - "uid": "otel-log4j2-dashboard", - "version": 1, - "weekStart": "" -} diff --git a/loki/grafana/provisioning/datasources/datasource.yml b/loki/grafana/provisioning/datasources/datasource.yml deleted file mode 100644 index a480530..0000000 --- a/loki/grafana/provisioning/datasources/datasource.yml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: 1 - -datasources: - - name: Loki - type: loki - access: proxy - url: http://loki:3100 - version: 1 - editable: true - isDefault: true - jsonData: - maxLines: 1000 diff --git a/loki/src/main/java/com/miti99/loki/LogGenerator.java b/loki/src/main/java/com/miti99/loki/LogGenerator.java new file mode 100644 index 0000000..90c0657 --- /dev/null +++ b/loki/src/main/java/com/miti99/loki/LogGenerator.java @@ -0,0 +1,116 @@ +package com.miti99.loki; + +import java.util.Random; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +public class LogGenerator { + + private static final String[] SERVICES = { + "auth-service", + "user-service", + "payment-service", + "notification-service", + "product-service", + "order-service" + }; + private static final String[] OPERATIONS = { + "create", "read", "update", "delete", "process", "validate", "authenticate" + }; + private static final String[] ENTITIES = { + "user", "order", "payment", "product", "account", "session", "transaction" + }; + + private final Random random = new Random(); + private int requestCounter = 0; + + public void generateLogs() { + String service = SERVICES[random.nextInt(SERVICES.length)]; + String operation = OPERATIONS[random.nextInt(OPERATIONS.length)]; + String entity = ENTITIES[random.nextInt(ENTITIES.length)]; + String level = getRandomLogLevel(); + + requestCounter++; + String requestId = String.format("REQ-%06d", requestCounter); + + switch (level) { + case "INFO" -> + log.info( + "Service: {}, Operation: {} {}, RequestId: {}", + service, + operation, + entity, + requestId); + + case "DEBUG" -> + log.debug( + "Service: {}, Operation: {} {}, Details: {}, RequestId: {}", + service, + operation, + entity, + generateDetails(operation, entity), + requestId); + + case "WARN" -> + log.warn( + "Service: {}, Operation: {} {}, Warning: {}, RequestId: {}", + service, + operation, + entity, + generateWarning(), + requestId); + + case "ERROR" -> + log.error( + "Service: {}, Operation: {} {}, Error: {}, RequestId: {}", + service, + operation, + entity, + generateError(), + requestId); + } + } + + private String getRandomLogLevel() { + int rand = random.nextInt(100); + if (rand < 60) { + return "INFO"; + } else if (rand < 80) { + return "DEBUG"; + } else if (rand < 95) { + return "WARN"; + } else { + return "ERROR"; + } + } + + private String generateDetails(String operation, String entity) { + return String.format( + "%s %s with id=%d, took %dms", + operation, entity, random.nextInt(10000), random.nextInt(500)); + } + + private String generateWarning() { + String[] warnings = { + "Operation taking longer than expected", + "Resource utilization high", + "Rate limit approaching", + "Using deprecated API", + "Retrying operation after temporary failure" + }; + return warnings[random.nextInt(warnings.length)]; + } + + private String generateError() { + String[] errors = { + "Database connection failed", + "Authentication failed", + "Invalid input data", + "Resource not found", + "Service timeout", + "Permission denied", + "Rate limit exceeded" + }; + return errors[random.nextInt(errors.length)]; + } +} diff --git a/loki/src/main/java/com/miti99/loki/LoggingExample.java b/loki/src/main/java/com/miti99/loki/LoggingExample.java deleted file mode 100644 index 1044b50..0000000 --- a/loki/src/main/java/com/miti99/loki/LoggingExample.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.miti99.loki; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.ThreadContext; - -import java.util.Random; - -public class LoggingExample { - private static final Logger logger = LogManager.getLogger(LoggingExample.class); - private final Random random = new Random(); - - public void performLogging() { - logger.info("Starting logging example"); - - // Using MDC (Mapped Diagnostic Context) with ThreadContext - ThreadContext.put("requestId", generateRequestId()); - ThreadContext.put("userId", "user-" + random.nextInt(1000)); - - try { - // Simulate a series of operations with logging - simulateUserAuthentication(); - simulateDataProcessing(); - simulateApiCall(); - } finally { - // Clean up ThreadContext - ThreadContext.clearAll(); - } - - logger.info("Completed logging example"); - } - - private void simulateUserAuthentication() { - logger.info("User authentication started"); - - // Simulate processing time - sleep(200); - - if (random.nextBoolean()) { - logger.info("User authentication successful"); - } else { - logger.warn("User authentication required additional verification"); - sleep(300); - logger.info("Secondary authentication successful"); - } - } - - private void simulateDataProcessing() { - logger.info("Data processing started"); - - // Simulate processing time - sleep(500); - - // Log processing metrics - int recordsProcessed = random.nextInt(1000) + 100; - double processingTime = random.nextDouble() * 400; - - logger.info("Processed {} records in {} ms", recordsProcessed, String.format("%.2f", processingTime)); - - // Occasionally log an error - if (random.nextInt(10) < 2) { - logger.error("Failed to process some records due to data corruption"); - } - } - - private void simulateApiCall() { - logger.info("External API call initiated"); - - // Simulate API call latency - int latency = random.nextInt(1000) + 100; - sleep(latency); - - // Log response status - int statusCode = random.nextInt(10) < 8 ? 200 : 500; - - if (statusCode == 200) { - logger.info("API call successful with latency {} ms", latency); - } else { - logger.error("API call failed with status code {}", statusCode); - sleep(300); - logger.info("Retrying API call"); - statusCode = random.nextInt(10) < 9 ? 200 : 500; - - if (statusCode == 200) { - logger.info("Retry successful"); - } else { - logger.error("Retry also failed with status code {}", statusCode); - } - } - } - - private String generateRequestId() { - return "req-" + Integer.toHexString(random.nextInt(0x1000000)); - } - - private void sleep(long millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - logger.warn("Sleep interrupted", e); - } - } -} diff --git a/loki/src/main/java/com/miti99/loki/Main.java b/loki/src/main/java/com/miti99/loki/Main.java index ea1b5ac..fdfb6f6 100644 --- a/loki/src/main/java/com/miti99/loki/Main.java +++ b/loki/src/main/java/com/miti99/loki/Main.java @@ -1,93 +1,19 @@ package com.miti99.loki; -import io.opentelemetry.api.OpenTelemetry; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.logs.SdkLoggerProvider; -import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor; -import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.semconv.ResourceAttributes; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import lombok.extern.log4j.Log4j2; +@Log4j2 public class Main { - private static final Logger logger = LogManager.getLogger(Main.class); - public static void main(String[] args) { - // Configure OpenTelemetry - OpenTelemetry openTelemetry = configureOpenTelemetry(); + public static void main(String[] args) { + LogGenerator logGenerator = new LogGenerator(); - // Start logging - logger.info("Application started"); + ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + executor.scheduleAtFixedRate(logGenerator::generateLogs, 0, 1, TimeUnit.SECONDS); - // Run logging example - LoggingExample loggingExample = new LoggingExample(); - loggingExample.performLogging(); - - - // Generate some additional logs - generateSampleLogs(); - - logger.info("Application stopping"); - } - - private static OpenTelemetry configureOpenTelemetry() { - // Define service resource - Resource resource = Resource.getDefault() - .merge(Resource.create(Attributes.of( - ResourceAttributes.SERVICE_NAME, "opentelemetry-log4j2-alloy", - ResourceAttributes.SERVICE_VERSION, "1.0.0" - ))); - - // Configure OtlpGrpcLogRecordExporter - this will send logs to Alloy - OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter.builder() - .setEndpoint("http://localhost:4317") // Alloy OTLP endpoint - .build(); - - // Create SDK LoggerProvider - SdkLoggerProvider loggerProvider = SdkLoggerProvider.builder() - .setResource(resource) - .addLogRecordProcessor(BatchLogRecordProcessor.builder(logExporter) - .setScheduleDelay(100, TimeUnit.MILLISECONDS) - .build()) - .build(); - - // Build OpenTelemetry SDK - OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder() - .setLoggerProvider(loggerProvider) - .build(); - - // Register a shutdown hook to close the SDK when the application exits - Runtime.getRuntime().addShutdownHook(new Thread(loggerProvider::close)); - - return openTelemetrySdk; - } - - private static void generateSampleLogs() { - // Generate various log levels - logger.debug("This is a debug message"); - logger.info("This is an info message"); - logger.warn("This is a warning message"); - logger.error("This is an error message"); - - // Generate a log with an exception - try { - throw new RuntimeException("Simulated exception"); - } catch (Exception e) { - logger.error("Exception occurred during processing", e); - } - - // Generate logs with different contexts - logger.info("User login successful", () -> "userId: 12345"); - logger.info("Payment processed", () -> "amount: $199.99, orderId: ORD-98765"); - - // Add a slight delay to make logs more readable in the UI - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } + log.info("Application started. Press Ctrl+C to stop."); + } } diff --git a/loki/src/main/resources/log4j2.xml b/loki/src/main/resources/log4j2.xml index ff43386..ddd2f51 100644 --- a/loki/src/main/resources/log4j2.xml +++ b/loki/src/main/resources/log4j2.xml @@ -1,33 +1,35 @@ - - - opentelemetry-log4j2-alloy - 1.0.0 - - + - - - - + + + localhost + 3100 + + + %X{tid} [%t] %d{MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n%exception{full} + + + - + - + diff --git a/loki/src/main/resources/otel-collector-config.yaml b/loki/src/main/resources/otel-collector-config.yaml deleted file mode 100644 index c22af19..0000000 --- a/loki/src/main/resources/otel-collector-config.yaml +++ /dev/null @@ -1,44 +0,0 @@ -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - -processors: - batch: - send_batch_size: 1000 - timeout: 10s - - resourcedetection: - detectors: [ env, system ] - timeout: 2s - - attributes: - actions: - - key: service.name - action: upsert - value: "opentelemetry-log4j2-alloy" - -exporters: - logging: - loglevel: debug - - loki: - endpoint: http://loki:3100/loki/api/v1/push - tenant_id: "alloy" - labels: - resource: - service.name: "service_name" - service.version: "service_version" - attributes: - severity: "severity" - log.level: "log_level" - -service: - pipelines: - logs: - receivers: [ otlp ] - processors: [ batch, resourcedetection, attributes ] - exporters: [ logging, loki ]