Apollo-Server-集成性能监控

30次阅读

共计 1694 个字符,预计需要花费 5 分钟才能阅读完成。

Apollo Server开箱支持 Apollo Engine, 只是由于某些不可知的原因Apollo Engine 的 API 在国内不可访问(我是真不知道为什么这个 API 会被墙的), 所以只能另外想办法了.

Apollo Server本身有一个 Apollo Tracing 可以用于性能监控的扩展, 通过扩展 Apollo Tracing 收集指标传输到分布式跟踪系统中.
另外有一个开源库 Apollo Opentracing 可以收集指标, 传输到 Jaeger 或者 Zipkin 中, 通过 JaegerZipkin实现性能监控和分析.

秉着方便, 直接使用Apollo Opentracing. 分布式跟踪系统使用Jaeger.

使用 Docker 搭建Jaeger

Jaeger 官方文档

在浏览器打开 http://localhost:16686 访问Jaeger

搭建Apollo Server

mkdir apollo-opentracing-demo
cd apollo-opentracing-demo
yarn init -y
yarn add apollo-server
// index.js
const {ApolloServer, gql} = require('apollo-server')

const typeDefs = gql`
  type Query {hello: String}
`

const resolvers = {
  Query: {hello: () => 'world',
  },
}

const server = new ApolloServer({
  typeDefs,
  resolvers,
})

server.listen().then(({ url}) => {console.log(`???? Server ready at ${url}`)
})

运行

node index.js

集成Apollo Opentracing

yarn add apollo-opentracing jaeger-client
// tracer.js
const {default: OpentracingExtension} = require('apollo-opentracing')
const {initTracer} = require('jaeger-client')

const config = {
  serviceName: 'apollo-opentracing-demo',
  sampler: {
    type: 'const',
    param: 1,
  },
  reporter: {
    logSpans: true,
    collectorEndpoint: 'http://localhost:14268/api/traces',
  },
}

const options = {
  logger: {info(msg) {console.log('INFO', msg)
    },
    error(msg) {console.log('ERROR', msg)
    },
  },
}

const tracer = initTracer(config, options)

const opentracingExtension = () => {console.log(123)
  return new OpentracingExtension({
    local: tracer,
    server: tracer,
  })
}
module.exports = {opentracingExtension,}
const {opentracingExtension} = require('./tracer.js') // 引入扩展

...

const server = new ApolloServer({
  typeDefs,
  resolvers,
  extensions: [opentracingExtension], // 使用扩展
})
...

使用

用浏览器打开 http://localhost:4000/

使用以下语句查询

query {hello}

然后打开 http://localhost:16686

点击 Find Traces 就能看到刚刚查询的指标

参考

  • Performance Tracing for GraphQL with Apollo and it’s friends
  • Apollo Opentracing
  • Jaeger
  • jaeger-client-node

正文完
 0