npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

apollo-newrelic

v1.0.0

Published

Apollo Server extension library for performing NewRelic transaction traces of graphql requests

Downloads

1,527

Readme

apollo-newrelic

There are two ways to use this library: one way is to instrument your HTTP requests against Apollo Server as transactions, and the other way is to mark top-level fields on Queries and Mutations as transactions. The former option is a little bit simpler to integrate, but gives less precise data in NR. The latter option gives more granular data but requires a little more setup.

Option 1: Marking requests as transactions

Given the following query:

query {
  blogPost(id: "12345") {
    id
    name
  }
  author(id: "abcde") {
    title
    avatarUrl
  }
}

It will display in NR as /graphql(blogPost(...)) because the client did not provide an operation name, so it's simply using the name of the first field to try to identify the request. If an operation name is provided, that will be used.

query Test {
  # the query here
}

Will display as /graphql(Test)

Usage

  1. yarn add apollo-newrelic
  2. Enable tracing in your ApolloServer configuration.
  3. Connect an extension instance to the ApolloServer configuration.

Example

const express = require('express')
const { ApolloServer } = require('apollo-server-express')
const ApolloNewRelic = require('apollo-newrelic')
const typeDefs = require('./typeDefs')
const resolvers = require('./resolvers')

const server = new ApolloServer({
  typeDefs,
  resolvers,
  // ...additional configuration...

  // Thunk for creating the newrelic extension
  extensions: [() => new ApolloNewRelic()],

  // Be sure to enable tracing
  tracing: true,
})

const app = express()
server.applyMiddleware({ app })

app.listen(3000, () => console.log('Server listening on port 3000'))

Option 2: Marking top-level fields as transactions

Given the following query and mutation:

query {
  blogPost(id: "12345") {
    id
    name
  }
  author(id: "abcde") {
    title
    avatarUrl
  }
}

mutation {
  createBlogPost(title: "GraphQL is super neat") {
    id
    name
  }
}

It will display in NewRelic as:

  • /Query: blogPost
  • /Query: author
  • /Mutation: createBlogPost

This is nice for a few of reasons. First, the two top-level fields in the query have different tracing profiles, and it's nice to see them broken out as such in NewRelic. Second, it's also nice to see a clear differentiation between queries and mutations. Third, it's nice not to have to rely on the client providing an operation name for their query or mutation in order to have granular data in NewRelic.

Usage

  1. yarn add apollo-newrelic
  2. Mark your exported resolvers as transactions

Example

const express = require('express')
const { ApolloServer, makeExecutableSchema } = require('apollo-server-express')
const { markResolversAsTransactions } = require('apollo-newrelic')
// wrap the exported resolvers object here
const typeDefs = require('./typeDefs')
const resolvers = markResolversAsTransactions({
  Query: {
    blogPost: (parent, args, context) => {
      return Db.getBlogPost()
    },
    author: (parent, args, context) => {
      return Db.getAuthor()
    },
  },
  Mutation: {
    createBlogPost: (parent, args, context) => {
      return Db.createBlogPost()
    },
  },
})

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

const app = express()
server.applyMiddleware({ app })

app.listen(3000, () => console.log('Server listening on port 3000'))

Credits

This lib is forked from apollo-newrelic-extension.

Special thanks to ddombrow for this gist.