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

graphql-metrics

v1.0.2

Published

GraphQL Metrics and Analytics

Downloads

18

Readme

graphql-metrics

GraphQL Metrics modifies an existing GraphQLSchema to allow the developer to collect performance metrics of all GraphQL Resolver functions. Metrics can be extracted from the GraphQL Context and logged anywhere the developer wishes.

Installation

Installation is as easy as:

npm i graphql-metrics

graphql-metrics has a dependency on the graphql library.

graphql-metrics has been tested on graphql version 14.5.8.

Usage

To start capturing metrics call enableGraphGLMetrics and pass it your GraphQLSchema:

const graphQlSchema: GraphQLSchema = enableGraphGLMetrics (
  new GraphQLSchema({
    ...,
  });
);

After execution GraphQL Metrics can be extracted from the GraphQL Context:

const gqlSchema: GraphQLSchema = enableGraphGLMetrics ( ... );
const context: IGraphQLMetricEnabledContext = {
  ...,
  metrics: [],
};

const result = await graphql(gqlSchema, ..., ..., context);

// context.metrics contains an array of Metrics from execution

If a resolver throws an error partial metrics can still be recovered including the error that was thrown:

const result = await graphql(gqlSchema, ..., ..., context);
// context.metrics[indexToFailedResolver].error contains the error thrown inside that resolver

Example

Considering this Schema:

const queryType = new GraphQLObjectType({
  name: "Query",
  fields: {
    order: {
      type: orderType,
      args: {
        id: { type: GraphQLString },
      },
      resolve: (_, { id }) => {
        return someCodeToGetOrder(id);
      },
    },
  },
});

const orderType = new GraphQLObjectType({
  name: "Order",
  fields: {
    id: {
      type: new GraphQLNonNull(GraphQLString),
      resolve: () => getOrderId(),
    },
    retailerId: {
      type: new GraphQLNonNull(GraphQLString),
      resolve: () => getRetailerId(),
    },
    orderLines: {
      type: new GraphQLNonNull(new GraphQLList(orderLineType)),
      resolve: (order) => getOrderLines(),
    },
  },
});

const orderLineType = new GraphQLObjectType({
  name: "OrderLine",
  fields: {
    productId: {
      type: new GraphQLNonNull(GraphQLInt),
      resolve: (orderLine) => getProductId(),
    },
    quantity: {
      type: new GraphQLNonNull(GraphQLInt),
      resolve: (orderLine) => getQuantity(),
    },
  },
});

We could generate these example metrics: (As orderLiens is an array the resolver path will show the index into the array of the item being resolved)

[
  GraphQLMetricData {
    resolverPath: 'order',
    success: true,
    durationMilliseconds: 0.05962499976158142,
    error: undefined },
  GraphQLMetricData {
    resolverPath: 'order/id',
    success: true,
    durationMilliseconds: 0.02204899489879608,
    error: undefined },
  GraphQLMetricData {
    resolverPath: 'order/orderLines',
    success: true,
    durationMilliseconds: 0.01929599791765213,
    error: undefined },
  GraphQLMetricData {
    resolverPath: 'order/orderLines/0/productId',
    success: true,
    durationMilliseconds: 0.033233001828193665,
    error: undefined },
  GraphQLMetricData {
    resolverPath: 'order/orderLines/0/quantity',
    success: true,
    durationMilliseconds: 0.01434200257062912,
    error: undefined },
  GraphQLMetricData {
    resolverPath: 'order/orderLines/1/productId',
    success: true,
    durationMilliseconds: 0.0017090067267417908,
    error: undefined },
  GraphQLMetricData {
    resolverPath: 'order/orderLines/1/quantity',
    success: true,
    durationMilliseconds: 0.0014280006289482117,
    error: undefined },
]