我正在try 运行APM-SERVER从基于Java的应用程序中收集并发送到使用APM-AGENT的ElasticSearch. 这是我的作文文件:

services:
  order-service:
    image: apm-java/order-service:1.0.0
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - "JAR_PATH=target/order-service-0.0.1.jar"
    environment:
      - "JAR_NAME=order-service-0.0.1.jar"
      - "JVM_OPTIONS="
      - "ELASTIC_APM_SERVICE_NAME=order-service"
      - "ELASTIC_APM_APPLICATION_PACKAGES=org.elk.orderservice"
      - "ELASTIC_APM_SERVER_URLS=http://apm:8200"
    ports:
      - 8080:8080
    networks:
      - app-network
    depends_on:
      - postgres
      - redis
      - apm

  kibana:
    image: kibana:8.11.3
    environment:
      - "LOGGING_QUIET=true"
    ports:
      - 5601:5601
    networks:
      - app-network
    depends_on:
      - elasticsearch

  elasticsearch:
    image: apm-java/elasticsearch:1.0.0
    build:
      context: ./docker/elasticsearch
      dockerfile: Dockerfile
    environment:
      - cluster.name=apm-java
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"
      - ELASTIC_PASSWORD=$ELASTIC_PASSWORD
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - app-network
    ports:
      - 9200:9200

  apm:
    image: apm-java/apm-server:1.0.0
    build:
      context: ./docker/apm
      dockerfile: Dockerfile
    environment:
      - "ELASTICSEARCH_USERNAME=elastic"
      - "ELASTICSEARCH_PASSWORD=$ELASTIC_PASSWORD"
    ports:
      - 8200:8200
    networks:
      - app-network
    depends_on:
      - elasticsearch
      - kibana

  postgres:
    image: 'postgres:16.1'
    environment:
      - 'POSTGRES_DB=mydatabase'
      - 'POSTGRES_PASSWORD=secret'
      - 'POSTGRES_USER=myuser'
    ports:
      - '5432:5432'
    networks:
      - app-network

  redis:
    image: 'redis:7.2.3'
    ports:
      - '32780:6379'
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
    name: app-network

Java应用程序停靠文件:

FROM eclipse-temurin:21-jdk

EXPOSE 8080
RUN mkdir -p /opt/app
WORKDIR /opt/app

ARG JAR_PATH
COPY $JAR_PATH /opt/app
RUN wget -O apm-agent.jar https://search.maven.org/remotecontent?filepath=co/elastic/apm/elastic-apm-agent/1.45.0/elastic-apm-agent-1.45.0.jar

CMD java -javaagent:/opt/app/apm-agent.jar $JVM_OPTIONS -jar $JAR_NAME

APM-SERVER YML,dockerfile:

apm-server:
  host: "localhost:8200"
  concurrent_requests: 5
  rum:
    enabled: true

queue.mem.events: 4096
max_procs: 4

output.elasticsearch:
  hosts: ["https://elasticsearch:9200"]
  username: "elastic"
  password: "changeme"
  ssl.verification_mode: none


setup.kibana.host: "kibana:5601"
setup.dashboards.enabled: true

#logging.level: info
#logging.to_files: false

logging.level: debug
logging.to_files: false
FROM docker.elastic.co/apm/apm-server:8.11.3
COPY --chmod=0644 --chown=1000:1000 apm-server.yml /usr/share/apm-server/apm-server.yml

ElasticSearch conf,dockerfile:

cluster.name: ${cluster.name}
network.host: 0.0.0.0

# minimum_master_nodes need to be explicitly set when bound on a public IP
# set to 1 to allow single node clusters
# Details: https://github.com/elastic/elasticsearch/pull/17288
discovery.type: single-node
FROM docker.elastic.co/elasticsearch/elasticsearch:8.11.3
COPY --chown=elasticsearch:elasticsearch elasticsearch.yml /usr/share/elasticsearch/config/

CMD ["elasticsearch", "-Elogger.level=INFO"]

我可以使用apm-server test output命令从APM-SERVER连接到ElasticSearch:

elasticsearch: https://elasticsearch:9200...
  parse url... OK
  connection...
    parse host... OK
    dns lookup... OK
    addresses: 172.23.0.3
    dial up... OK
  TLS...
    security... WARN server's certificate chain verification is disabled
    handshake... OK
    TLS version: TLSv1.3
    dial up... OK
  talk to server... OK
  version: 8.11.3

但在Java应用程序日志(log)中收到以下错误:

2024-01-10 08:05:29,528 [main] INFO  co.elastic.apm.agent.configuration.StartupInfo - Starting Elastic APM 1.45.0 as order-service (0.0.1) on Java 21.0.1 Runtime version: 21.0.1+12-LTS VM version: 21.0.1+12-LTS (Eclipse Adoptium) Linux 6.5.11-linuxkit
2024-01-10T08:05:29.529074548Z 2024-01-10 08:05:29,528 [main] INFO  co.elastic.apm.agent.configuration.StartupInfo - server_urls: 'http://apm:8200' (source: Environment Variables)
2024-01-10T08:05:29.529416131Z 2024-01-10 08:05:29,529 [main] INFO  co.elastic.apm.agent.configuration.StartupInfo - application_packages: 'org.elk.orderservice' (source: Environment Variables)
2024-01-10T08:05:30.587938173Z 2024-01-10 08:05:30,587 [elastic-apm-server-healthcheck] WARN  co.elastic.apm.agent.report.ApmServerHealthChecker - Elastic APM server http://apm:8200/ is not available (Connection refused)
2024-01-10T08:05:30.589589381Z 2024-01-10 08:05:30,589 [main] INFO  co.elastic.apm.agent.impl.ElasticApmTracer - Tracer switched to RUNNING state
2024-01-10T08:05:31.430460173Z 2024-01-10 08:05:31,429 [elastic-apm-remote-config-poller] ERROR co.elastic.apm.agent.configuration.ApmServerConfigurationSource - Connection refused

所有服务绑定到单一的"应用程序网络". 那么是什么原因导致java-agent和apm-server之间的连接出现问题呢? 如何将流从java调试到elk?

推荐答案

APM服务器绑定到本地主机,在expose 端口时阻止访问.要解决此问题,请将apm.server.yml从:

apm-server:
  host: "localhost:8200"

致:

apm-server:
  host: "0.0.0.0:8200"

Java相关问答推荐

Android视图覆盖不阻止点击它后面的控件

在Java中测试DAO方法:假实现与内存数据库

使用意向过滤器从另一个应用程序启动服务

无法在WebSocket onMessage中捕获错误

Spring Boot@Cachebale批注未按预期工作

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

CompleteableFuture是否运行在不同的内核上?

Mapstruct不能正确/完全映射属性

从Spring5迁移到Spring6:无法在雅加达包中找到类

如何从错误通道回复网关,使其不会挂起

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

如何在列表(链表)中插入一个新 node (作为prelast)

try 在两个不同数组的数字之间求平均值

项目react 堆中doOnComplete()和Subscribe()的第三个参数之间的差异

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

在实例化中指定泛型类型与不指定泛型类型之间的区别

为什么项目名称出现在我的GET请求中?

本机方法(JNI)总是编译的吗?

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

由于可为null,无法在kotlin中实现java接口