Spring AI 可观测介绍与实践

Spring AI 可观测介绍与实践

Spring AI 通过集成 micrometer 来完成 Model 中观测能力。MicroMeter 本身支持对 otel,zipkin 等多种形式的数据格式的导出。此文中通过 zipkin 和 grafana 的方式演示 Spring AI 的可观测功能。

Github 代码地址:https://github.com/deigmata-paideias/deigmata-paideias/tree/main/ai/observations

Spring AI 可观测 Example

Zipkin

也可以使用 jaeger 代替 zipkin。

代码和环境准备

引入 micrometer 和 zipkin 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.4.2</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-starter</artifactId>
        <version>1.0.0-M6.1</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>3.4.2</version>
    </dependency>

    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing-bridge-brave</artifactId>
        <version>1.5.0-M2</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>io.zipkin.reporter2</groupId>
        <artifactId>zipkin-reporter-brave</artifactId>
        <version>3.4.3</version>
    </dependency>

</dependencies>

application.yml 配置

配置 Spring AI 可观测性的配置开关和 actuator 的 endpoint 相关配置。

并没有配置 apikey,spring ai alibaba starter 会默认在环境变量里查询相关 key。

 spring:
  ai:
	# 注意:观测数据可能存在敏感信息!
    chat:
      client:
        observations:
          # 记录调用输入
          include-input: true
      observations:
        # 记录 LLMs 输出
        include-completion: true
        # 记录 prompt
        include-prompt: true
        include-error-logging: true

# 部署时不配置,使用默认配置
management:
  endpoints:
    web:
      exposure:
        # 开放所有外部端点
        include: "*"
  endpoint:
    health:
      # 应用健康状态检查,携带详细新学年
      show-details: always
  tracing:
    sampling:
        # trace 采样信息,记录每个请求
        probability: 1.0

docker compose zipkin

本例中将监控数据导入到 zipkin

services:

  zipkin:
    image: 'openzipkin/zipkin:latest'
    container_name: "sa-zipkin"
    ports:
      - '9411:9411'

chat 应用

@RestController
@RequestMapping("/chat")
public class ChatController {

	private final ChatClient client;

	private ChatController(ChatModel model) {

		this.client = ChatClient.builder(model)
				.build();
	}

	@GetMapping
	public Flux<String> chat(
			@RequestParam("prompt") String prompt,
			HttpServletResponse response
	) {

		response.setCharacterEncoding("UTF-8");
		return client.prompt()
				.user(prompt)
				.stream()
				.content();
	}
}
效果演示
访问接口
# requset
curl http://localhost:8080/chat?prompt=你好

# response
你好!今天过得怎么样?
zipkin 查看请求

在这里插入图片描述

可以看到,请求的相关信息已经打印到了 zipkin 控制台。

prometheus + Grafana

代码和环境准备

pom.yml

将上面 zipkin 的依赖替换为:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.4.2</version>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter</artifactId>
    <version>1.0.0-M6.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>3.4.2</version>
</dependency>

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.14.5</version>
</dependency>

application.yml 改为:

spring:
  application:
    name: "spring-ai-observations-example"

  ai:
    # 注意:观测数据可能存在敏感信息!
    chat:
      client:
        observations:
          # 记录调用输入
          include-input: true
      observations:
        # 记录 LLMs 输出
        include-completion: true
        # 记录 prompt
        include-prompt: true
        include-error-logging: true

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
  tracing:
    sampling:
      probability: 1.0
  prometheus:
    metrics:
      export:
        enabled: true
  metrics:
    tags:
      application: ${spring.application.name}

部署 grafana 和 prometheus 和 docker-compose.yml

services:

  prometheus:
    container_name: "sa-prometheus"
    hostname: "sa-prometheus"
    image: prom/prometheus:latest
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    hostname: "sa-grafana"
    container_name: "sa-grafana"
    ports:
      - "3000:3000"

networks:
  bridge:
    driver: bridge

prometheus 配置文件:(在 docker 中启动时,需要注意 job targets 配置成宿主机的 ipv4 地址,否则会连接失败!)

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
    # prometheus 上面是默认的数据

  # 抓取任务配置
  - job_name: 'policy-prometheus'
    # 抓取目标的路径,其中?替换为要监听的服务前缀端口
    # micrometer 端点默认没有前缀
    metrics_path: '/actuator/prometheus'
    static_configs:
      # 抓取任务的目标地址,可以使用数组的形式配置多个端口监听
      - targets: ["192.168.99.117:8080"]
效果演示
  1. 访问 http://localhost:8080/actuator/prometheus 即可看到 ai 应用暴露的指标信息;
  2. 访问 prometheus http://localhost:9090/targets?search= 可以看到 jobs 信息;
  3. 访问 grafana ,在导入数据源和 dashboard 之后可以看到 metrics 面板。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值