GraphQL 是一种优秀的 API 查询语言,它可以帮助开发者更加灵活、高效的查询和获取所需数据。但是,当我们使用 GraphQL 构建 API 时,也需要考虑到监控和日志记录,以便更好地管理和维护应用程序。在本文中,我们将介绍如何在前端应用中为 GraphQL API 添加监控和日志记录。
监控 GraphQL API
监控 GraphQL API 的主要目的是收集和分析 API 的性能指标,这样可以及时发现问题并进行优化,以保证 API 的性能和可靠性。下面介绍如何为 GraphQL API 添加监控。
安装 Apollo Server
Apollo Server 是一款流行的用于处理 GraphQL API 的库。我们可以使用它来创建 GraphQL API,并为其添加监控。首先,我们需要安装 Apollo Server:
npm install apollo-server
安装 Prometheus
Prometheus 是一个流行的开源监控系统,用于收集和存储指标数据,并支持可视化和警报功能。我们可以使用 Prometheus 来监控 GraphQL API 的性能指标。首先,我们需要安装 Prometheus:
npm install prom-client
添加监控中间件
接下来,我们需要为 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