如何为 GraphQL API 添加监控和日志记录

GraphQL 是一种优秀的 API 查询语言,它可以帮助开发者更加灵活、高效的查询和获取所需数据。但是,当我们使用 GraphQL 构建 API 时,也需要考虑到监控和日志记录,以便更好地管理和维护应用程序。在本文中,我们将介绍如何在前端应用中为 GraphQL API 添加监控和日志记录。

监控 GraphQL API

监控 GraphQL API 的主要目的是收集和分析 API 的性能指标,这样可以及时发现问题并进行优化,以保证 API 的性能和可靠性。下面介绍如何为 GraphQL API 添加监控。

安装 Apollo Server

Apollo Server 是一款流行的用于处理 GraphQL API 的库。我们可以使用它来创建 GraphQL API,并为其添加监控。首先,我们需要安装 Apollo Server:

安装 Prometheus

Prometheus 是一个流行的开源监控系统,用于收集和存储指标数据,并支持可视化和警报功能。我们可以使用 Prometheus 来监控 GraphQL API 的性能指标。首先,我们需要安装 Prometheus:

添加监控中间件

接下来,我们需要为 Apollo Server 添加一个监控中间件。中间件将在每次请求到达 GraphQL API 时收集性能指标,并将它们发送到 Prometheus 中。可以使用代码如下:

const { ApolloServer } = require('apollo-server');
const promClient = require('prom-client');

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => ({ req }),
});

const httpRequestDurationMicroseconds = new promClient.Histogram({
  name: 'http_request_duration_ms',
  help: 'Duration of HTTP requests in ms',
  labelNames: ['route'],
  buckets: [0.1, 5, 15, 50, 100, 500],
});

server.applyMiddleware({ app });

app.use((req, res, next) => {
  const start = Date.now();
  res.on('finish', () => {
    const route = req.baseUrl + req.route.path;
    const durationInMilliseconds = Date.now() - start;
    httpRequestDurationMicroseconds
      .labels(route)
      .observe(durationInMilliseconds / 1000);
  });
  next();
});

可视化和警报

为了可视化和警报指标数据,我们可以使用导出 Prometheus 指标的 Grafana。Grafana 可以读取 Prometheus 指标,并提供各种可视化和警报功能,如图表、仪表板和警报规则。可以单独安装 Grafana,也可以使用 Docker Compose 进行安装。以下是示例 Docker Compose 配置:

version: '3.7'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - 9090:9090
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
      - ./prometheus/rules/prometheus.rules.yml:/etc/prometheus/rules/prometheus.rules.yml
    command: '--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prometheus/consoles'
  grafana:
    image: grafana/grafana
    container_name: grafana
    depends_on:
      - prometheus
    ports:
      - 3000:3000
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
      - ./grafana/dashboards:/var/lib/grafana/dashboards
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
  prometheus-data:
  grafana-data:

在 Grafana 上设置 Prometheus 数据源,然后配置仪表板和警报即可。

记录 GraphQL API 日志

记录 GraphQL API 日志的主要目的是追踪请求和响应的详细信息,助于故障排除和维护。下面介绍如何为 GraphQL API 记录日志。

添加日志中间件

首先,我们需要为 Apollo Server 添加一个日志中间件。中间件将在每次请求到达 GraphQL API 时记录请求和响应的详细信息。可以使用代码如下:

const { ApolloServer } = require('apollo-server');

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => ({ req }),
});

server.applyMiddleware({ app });

app.use((req, res, next) => {
  const start = Date.now();

  res.on('finish', () => {
    const durationInMilliseconds = Date.now() - start;
    const { statusCode } = res;
    const contentType = res.get('Content-Type');

    let log = `${req.method} ${req.originalUrl} ${statusCode} ${durationInMilliseconds}ms`;

    if (contentType && contentType.indexOf('application/json') !== -1) {
      log += ` ${JSON.stringify(req.body)} ${JSON.stringify(res.body)}`;
    }

    console.log(log);
  });

  next();
});

使用日志分析工具

为了更好地分析日志数据,我们可以使用日志分析工具。Logstash 是一个流行的开源日志分析工具,可以用于收集、处理和转发日志数据。我们可以将 GraphQL API 日志发送到 Logstash,并使用 Elasticsearch 进行存储和分析。以下是示例 Logstash 配置:

input {
  tcp {
    port => 5000
  }
}

filter {
  grok {
    match => { "message" => "%{WORD:method} %{URIPATH:request} %{NUMBER:statusCode:int} %{NUMBER:durationInMilliseconds:int}ms(?: %{GREEDYDATA:reqBody} %{GREEDYDATA:resBody})?" }
  }

  json {
    source => "reqBody"
    target => "reqBody"
    skip_on_invalid_json => true
  }

  json {
    source => "resBody"
    target => "resBody"
    skip_on_invalid_json => true
  }
}

output {
  elasticsearch {
    hosts => "http://elasticsearch:9200"
    index => "graphql-%{+YYYY.MM.dd}"
  }
}

可以使用 Docker Compose 进行安装。以下是示例 Docker Compose 配置:

version: '3.7'

services:
  app:
    build: .
    container_name: app
    ports:
      - 80:3000
    environment:
      NODE_ENV: production
      LOGSTASH_HOST: logstash:5000
    depends_on:
      - logstash
    networks:
      - app_network
  logstash:
    image: docker.elastic.co/logstash/logstash-oss:7.15.1
    container_name: logstash
    volumes:
      - ./logstash/config:/usr/share/logstash/config
    ports:
      - "5000:5000"
    environment:
      - "ES_JAVA_OPTS=-Xmx1g -Xms1g"
      - "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
    depends_on:
      - elasticsearch
    networks:
      - app_network
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.15.1
    container_name: elasticsearch
    volumes:
      - es_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    environment:
      - "ES_JAVA_OPTS=-Xmx1g -Xms1g"
      - "discovery.type=single-node"
    networks:
      - app_network
networks:
  app_network:
volumes:
  es_data:

在 Elasticsearch 上配置索引模板、可视化程序和警报规则,即可轻松地分析日志数据。

结论

在本文中,我们介绍了如何为 GraphQL API 添加监控和日志记录。监控和日志记录是应用程序管理和维护的重要组成部分,可以帮助我们更好地管理和维护 GraphQL API。希望本文能为前端开发人员在构建 GraphQL 应用时提供帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66fd35fe44713626017adf16