Skip to content

Commit

Permalink
add optional reportFilterFn to filter reports
Browse files Browse the repository at this point in the history
  • Loading branch information
helfer committed May 24, 2016
1 parent 6dc4026 commit 25c1914
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 5 deletions.
4 changes: 3 additions & 1 deletion src/schemaGenerator.js
Expand Up @@ -73,7 +73,9 @@ function makeExecutableSchema({
allowUndefinedInResolve = false,
resolverValidationOptions = {},
}) {
const jsSchema = _generateSchema(typeDefs, resolvers, logger, allowUndefinedInResolve, resolverValidationOptions);
const jsSchema = _generateSchema(
typeDefs, resolvers, logger, allowUndefinedInResolve, resolverValidationOptions
);
if (typeof resolvers.__schema === 'function') {
// TODO a bit of a hack now, better rewrite generateSchema to attach it there.
// not doing that now, because I'd have to rewrite a lot of tests.
Expand Down
14 changes: 12 additions & 2 deletions src/tracing.js
Expand Up @@ -8,24 +8,34 @@ class Tracer {
// TODO make sure Tracer can NEVER crash the server.
// maybe wrap everything in try/catch, but need to test that.

constructor({ TRACER_APP_KEY, sendReports = true }) {
constructor({ TRACER_APP_KEY, sendReports = true, reportFilterFn }) {
if (!TRACER_APP_KEY || TRACER_APP_KEY.length < 36) {
throw new Error('Tracer requires a well-formatted TRACER_APP_KEY');
}
// TODO check that sendReports is a boolean
// TODO check that report filter fn is a function (if defined)
this.TRACER_APP_KEY = TRACER_APP_KEY;
this.startTime = (new Date()).getTime();
this.startHrTime = now();
this.sendReports = sendReports;
this.reportFilterFn = reportFilterFn;
}

sendReport(report) {
let filteredEvents = report.events;
if (this.reportFilterFn) {
filteredEvents = report.events.filter(this.reportFilterFn);
}
const options = {
url: TRACER_INGRESS_URL,
method: 'PUT',
headers: {
'user-agent': `apollo tracer v${report.tracerApiVersion}`,
},
json: report,
json: {
...report,
events: filteredEvents,
},
};
request(options, (err) => {
if (err) {
Expand Down
59 changes: 57 additions & 2 deletions test/testTracer.js
@@ -1,4 +1,4 @@
import { generateSchema, addTracingToResolvers } from '../src/schemaGenerator.js';
import { makeExecutableSchema, addTracingToResolvers } from '../src/schemaGenerator.js';
import { expect } from 'chai';
import { graphql } from 'graphql';
import { Tracer, decorateWithTracer } from '../src/tracing.js';
Expand Down Expand Up @@ -43,7 +43,11 @@ describe('Tracer', () => {
};

const t1 = new Tracer({ TRACER_APP_KEY: 'BDE05C83-E58F-4837-8D9A-9FB5EA605D2A' });
const jsSchema = generateSchema(shorthand, resolver);
const jsSchema = makeExecutableSchema({
typeDefs: shorthand,
resolvers: resolver,
allowUndefinedInResolve: true,
});
addTracingToResolvers(jsSchema);

it('throws an error if you construct it without valid TRACER_APP_KEY', () => {
Expand Down Expand Up @@ -188,6 +192,57 @@ describe('Tracer', () => {
});
});

it('calls request with the right arguments to report', () => {
let interceptedReport = null;
// test harness for submit
const realRequest = request.Request;
request.Request = (params) => {
interceptedReport = params.json;
};
const tracer = t1.newLoggerInstance();
const testQuery = `{
returnPromiseErr
}`;
return graphql(jsSchema, testQuery, null, { tracer }).then(() => {
tracer.submit();
const expected = [
'TRACER_APP_KEY',
'events',
'queryId',
'startHrTime',
'startTime',
'tracerApiVersion',
];
request.Request = realRequest;
expect(Object.keys(interceptedReport).sort()).to.deep.equal(expected);
expect(interceptedReport.events.length).to.equal(2);
});
});

it('filters events in sendReport if you tell it to', () => {
const t2 = new Tracer({
TRACER_APP_KEY: 'BDE05C83-E58F-4837-8D9A-9FB5EA605D2A',
reportFilterFn: (e) => (e.type !== 'resolver.end'),
});
let interceptedReport = null;
// test harness for submit
const realRequest = request.Request;
request.Request = (params) => {
interceptedReport = params.json;
};
const tracer = t2.newLoggerInstance();
const testQuery = `{
returnPromiseErr
}`;
return graphql(jsSchema, testQuery, null, { tracer }).then(() => {
tracer.submit();
request.Request = realRequest;
expect(interceptedReport.events.length).to.equal(1);
expect(interceptedReport.events[0].type).to.equal('resolver.start');
});
});


it('does not send report if sendReports is false', () => {
const t2 = new Tracer({
TRACER_APP_KEY: 'BDE05C83-E58F-4837-8D9A-9FB5EA605D2A',
Expand Down

0 comments on commit 25c1914

Please sign in to comment.