本文主要介绍怎么使用 docker 来安装一个 Prometheus 实例和一个 Grafana 实例,然后在本地也就是宿主机写测试程序 java-app,让这三者工作起来。PS:这个过程非常简单。

主要就是供大家学习使用,大家可以尽情做各种实验。实际生产环境,不太可能使用 docker 来部署 Prometheus 和 Grafana。

创建 docker 网络

首先创建一个 docker 网络,命名为 apm,后面的 Prometheus 容器和 Grafana 容器都用这个虚拟网络:

docker network create apm

安装 Prometheus

首先我们先在本地创建一个文件 prometheus.yml,用来挂载到 docker 中作为 Prometheus 的配置文件:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

创建一个 Prometheus 容器,注意使用你自己的 yml 文件路径:

docker run -d --name=prometheus --network=apm -v /Users/noah/apm/prometheus.yml:/etc/prometheus/prometheus.yml -p 9090:9090  prom/prometheus

如果安装顺利,用浏览器打开: http://localhost:9090 可以先熟悉一下 Prometheus 的 dashboard。

而且由于上面的配置文件已经指定了一个 job,实现了 Prometheus 的自监控,所以其实已经有部分数据可以供大家玩了。

安装 Grafana

安装 Grafana 非常简单,还是使用前面创建的 apm 网络:

docker run -d --name=grafana --network=apm -p 3000:3000 grafana/grafana

然后浏览器打开 http://localhost:3000 用户名、密码都是 admin,首次登录会要求你修改密码。

接下来就是添加 Prometheus 作为 Grafana 的一个数据源,这一步也非常简单,只要填一下这个 connection url 为 http://prometheus:9090 就可以了,如果保存成功,说明连接上了。

grafana-connection

创建测试应用 java-app

创建一个 Spring Boot 应用,我将其命名为 “java-app”,我一般喜欢用 https://start.spring.io/ 来生成这种项目。

Spring Boot 集成 Prometheus 很简单,首先是添加依赖 actuator 和 micrometer-registry-prometheus

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>io.micrometer</groupId>
			<artifactId>micrometer-core</artifactId>
		</dependency>
		<dependency>
			<groupId>io.micrometer</groupId>
			<artifactId>micrometer-registry-prometheus</artifactId>
		</dependency>
	</dependencies>

然后在 application.properties 中添加配置:

management.endpoints.web.exposure.include=prometheus
management.metrics.export.prometheus.enabled=true

启动 java-app,访问 http://localhost:8080/actuator/prometheus 如果能看到下面这种内容,说明配置成功了。

actuator_prometheus

我们可以看到,默认地,已经有很多的 metrics 了,所以不需要着急学习如何上报自定义的 metric,先集成起来再说。

当然,Micrometer 的 API 也是非常简单的,如上报一个 counter 类型的数据,就是一行非常简单的代码:

Metrics.counter("http_request_total", "uri", uri, "method", "POST").increment(1);

让 Prometheus 拉取应用数据

这一步是为了让 docker 中的 Prometheus 可以访问到 http://localhost:8080/actuator/prometheus 拉取数据。

因为 Prometheus 采用的是主动、定期 pull 的交互模型,所以我们需要在 Prometheus 中添加一个任务。

修改前面提到的配置文件 prometheus.yml,增加一个 job:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'java-app' # 任务名称,你可以随便定义你想要的名称
    metrics_path: '/actuator/prometheus' # 应用程序暴露指标的路径
    static_configs:
      - targets: ['host.docker.internal:8080'] # 目标地址列表,包括端口

这里由于是 docker 中的 Prometheus 要访问宿主机中的 java-app,所以我使用了固定地址 host.docker.internal,它代表宿主机。

修改完成后,重启 Prometheus:

docker restart prometheus

访问 Prometheus dashboard 的 Status -> Targets,如果看到 java-app 了,说明成功拉取到数据了:

prometheus-target

接下来,就是自己玩了。

小结

本文非常简单,使用 docker 能非常容易完成,写本文的目的主要是为了写另一篇文章,介绍 Prometheus 的数据结构,以及怎么创建 Grafana 图表,感兴趣的读者可以继续阅读。

(全文完)