Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

fix(tracing): Support HTTPS server tracing. #27

Merged
merged 1 commit into from
Jan 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Changelog

## 1.30.2
- Support HTTPS server tracing.

## 1.30.1
- Update `Server-Timing` response header in HTTP instrumentation to format of latest spec version.

Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions src/tracing/instrumentation/httpServer.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use strict';

var coreHttpsModule = require('https');
var coreHttpModule = require('http');

var discardUrlParameters = require('../../util/url').discardUrlParameters;
Expand All @@ -11,8 +12,8 @@ var cls = require('../cls');
var isActive = false;

exports.init = function() {
var proto = coreHttpModule.Server && coreHttpModule.Server.prototype;
shimmer.wrap(proto, 'emit', shimEmit);
shimmer.wrap(coreHttpModule.Server && coreHttpModule.Server.prototype, 'emit', shimEmit);
shimmer.wrap(coreHttpsModule.Server && coreHttpsModule.Server.prototype, 'emit', shimEmit);
};

function shimEmit(realEmit) {
Expand Down
17 changes: 14 additions & 3 deletions test/apps/express.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ require('../../')({

var express = require('express');
var semver = require('semver');
var path = require('path');
var fs = require('fs');
var app = express();

var healthcheckFunction = function() {
Expand Down Expand Up @@ -76,9 +78,18 @@ app.use(function(req, res) {
});


app.listen(process.env.APP_PORT, function() {
log('Listening on port: ' + process.env.APP_PORT);
});
if (process.env.USE_HTTPS === 'true') {
require('https').createServer({
key: fs.readFileSync(path.join(__dirname, 'ssl', 'key')),
cert: fs.readFileSync(path.join(__dirname, 'ssl', 'cert'))
}, app).listen(process.env.APP_PORT, function() {
log('Listening (HTTPS!) on port: ' + process.env.APP_PORT);
});
} else {
app.listen(process.env.APP_PORT, function() {
log('Listening on port: ' + process.env.APP_PORT);
});
}

function log() {
var args = Array.prototype.slice.call(arguments);
Expand Down
34 changes: 22 additions & 12 deletions test/apps/expressControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,14 @@ exports.registerTestHooks = function(opts) {
env.APP_PORT = appPort;
env.TRACING_ENABLED = opts.enableTracing !== false;
env.STACK_TRACE_LENGTH = opts.stackTraceLength || 0;
env.USE_HTTPS = opts.useHttps === true;

expressApp = spawn('node', [path.join(__dirname, 'express.js')], {
stdio: config.getAppStdio(),
env: env
});

return waitUntilServerIsUp();
return waitUntilServerIsUp(opts.useHttps);
});

afterEach(function() {
Expand All @@ -38,14 +39,15 @@ exports.registerTestHooks = function(opts) {
};


function waitUntilServerIsUp() {
function waitUntilServerIsUp(useHttps) {
return utils.retry(function() {
return request({
method: 'GET',
url: 'http://127.0.0.1:' + appPort,
url: getBaseUrl(useHttps),
headers: {
'X-INSTANA-L': '0'
}
},
strictSSL: false
});
});
}
Expand All @@ -58,8 +60,9 @@ exports.getPid = function() {
exports.sendBasicRequest = function(opts) {
return request({
method: opts.method,
url: 'http://127.0.0.1:' + appPort + opts.path,
resolveWithFullResponse: opts.resolveWithFullResponse
url: getBaseUrl(opts.useHttps) + opts.path,
resolveWithFullResponse: opts.resolveWithFullResponse,
strictSSL: false
});
};

Expand All @@ -68,15 +71,16 @@ exports.sendRequest = function(opts) {
opts.delay = opts.delay || 0;
return request({
method: opts.method,
url: 'http://127.0.0.1:' + appPort + opts.path,
url: getBaseUrl(opts.useHttps) + opts.path,
qs: {
responseStatus: opts.responseStatus,
delay: opts.delay,
cookie: opts.cookie,
serverTiming: opts.serverTiming,
serverTimingArray: opts.serverTimingArray
},
resolveWithFullResponse: opts.resolveWithFullResponse
resolveWithFullResponse: opts.resolveWithFullResponse,
strictSSL: false
})
.catch(errors.StatusCodeError, function(reason) {
if (reason.statusCode === opts.responseStatus) {
Expand All @@ -86,16 +90,22 @@ exports.sendRequest = function(opts) {
});
};

exports.setHealthy = function() {
exports.setHealthy = function(useHttps) {
return request({
method: 'POST',
url: 'http://127.0.0.1:' + appPort + '/admin/set-to-healthy'
url: getBaseUrl(useHttps) + '/admin/set-to-healthy',
strictSSL: false
});
};

exports.setUnhealthy = function() {
exports.setUnhealthy = function(useHttps) {
return request({
method: 'POST',
url: 'http://127.0.0.1:' + appPort + '/admin/set-to-unhealthy'
url: getBaseUrl(useHttps) + '/admin/set-to-unhealthy',
strictSSL: false
});
};

function getBaseUrl(useHttps) {
return 'http' + (useHttps ? 's' : '') + '://127.0.0.1:' + appPort;
}
22 changes: 22 additions & 0 deletions test/apps/ssl/cert
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDsjCCApoCCQCVNVVFMqyLHDANBgkqhkiG9w0BAQUFADCBmjELMAkGA1UEBhMC
REUxDDAKBgNVBAgTA05SVzERMA8GA1UEBxMIU29saW5nZW4xFTATBgNVBAoTDElu
c3RhbmEgR21iSDELMAkGA1UECxMCSVQxITAfBgNVBAMTGGxvY2FsLWluc3RhbmEu
aW5zdGFuYS5pbzEjMCEGCSqGSIb3DQEJARYUdGVjaHVzZXJAaW5zdGFuYS5jb20w
HhcNMTcwNTA1MTAwMDM5WhcNMTgwNTA1MTAwMDM5WjCBmjELMAkGA1UEBhMCREUx
DDAKBgNVBAgTA05SVzERMA8GA1UEBxMIU29saW5nZW4xFTATBgNVBAoTDEluc3Rh
bmEgR21iSDELMAkGA1UECxMCSVQxITAfBgNVBAMTGGxvY2FsLWluc3RhbmEuaW5z
dGFuYS5pbzEjMCEGCSqGSIb3DQEJARYUdGVjaHVzZXJAaW5zdGFuYS5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD1NYbSrqBURWpNIlRZVnQ14TSG
sN7T6hIKNJ0aNF3xOq1mWZt6sF0QKuyeDhbxydCH3VpFJ1U5Ye8EsfGzls+IjoZa
03Cv0XpyqvJ14bvoFx8zDdYH0zQa5Okx1dFg5erRTCZOO0TD1B9OwM/NWXiPocKw
rDIrN3puf+Wamx0BP9qR8XHSv8nFC4x02pUFFmoDl5sKVXDd+4itdAvJayBj6n0b
cB7aoJxMd+XBQaaeQrZnH8ZU/tRPNloxitDMHIsXOJadIa8MLhOLvqFdWLRujBr9
sdXmKubMCErReBBUxzzFBvoS9vcBlohZwA7NNzqFc2UHo50Am91dJ96GZBwTAgMB
AAEwDQYJKoZIhvcNAQEFBQADggEBAAfzp1KKCR2K19YLk+XK1u3f+7+RyA9DfcQX
xp/WA0QnjtbN9ftOIgTJe9Sd/imH//Is3ivAJiuEKGhTVshFMM3Yre8tQANPHiOl
6k3hC8A7JJz0UjY+y3+4AlRtvV+YkZpkHxsupOz9iIAJSQ7mif7RjrfbUXSz6UGO
lveHJlj5ifEDCM7ns6aY57umyDjiJ+cn8r7yRAUoSGmZ92C4RAE+sSNcPhWrKgIH
zwXSso8snAz8Xdb/qZz8lynZnaNkwGoM3Ji17BTCpJXOevwnnjMHimx5OYDtW3+G
Zy2qG4o1e+F1XGycL4Ji46B/xqNx2MDCbyr4B5UCdMApaU4vCAM=
-----END CERTIFICATE-----
27 changes: 27 additions & 0 deletions test/apps/ssl/key
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA9TWG0q6gVEVqTSJUWVZ0NeE0hrDe0+oSCjSdGjRd8TqtZlmb
erBdECrsng4W8cnQh91aRSdVOWHvBLHxs5bPiI6GWtNwr9F6cqrydeG76BcfMw3W
B9M0GuTpMdXRYOXq0UwmTjtEw9QfTsDPzVl4j6HCsKwyKzd6bn/lmpsdAT/akfFx
0r/JxQuMdNqVBRZqA5ebClVw3fuIrXQLyWsgY+p9G3Ae2qCcTHflwUGmnkK2Zx/G
VP7UTzZaMYrQzByLFziWnSGvDC4Ti76hXVi0bowa/bHV5irmzAhK0XgQVMc8xQb6
Evb3AZaIWcAOzTc6hXNlB6OdAJvdXSfehmQcEwIDAQABAoIBAQCG0KcPrnL34jJP
tlApzh6WgPsgEp5wZIEGm2bEwYXk2x3658lT6yM/gFoXjCeRSCQejtTSsI1qvy1q
p2r8Ei6IJdQ4m4eZItLvuI0VwsZNFGlS6IiERNqg7rpHbAdx/vbbm8JzwKJOCJIt
+lRF0qs2TPl9qS7sE9R8bFUQa7fGtwEzzwZX4TL3tnI1YLy0b/wAGQBgZVgvqy8D
HKeL1ygio4s5z9yvbLG5tzFj5jirEJpg8IU1E+pz8pyBcbQ6TatB3uqIGuAs5YYh
YiKrAiCamguT/jfIqzmkP/iyGTmmhZgBSHXzFepqyHhTFKOYlRdpyAtA7RtUEdh/
lrSrBSwBAoGBAPr3shCAzRwGHlLIu0B6N4iCQ+t0Zy8vuHhQGRsTi6XV+CYydjCf
52xYqVwcvNXSdmfNk1AyDEfQ9BrDSenvQ/AxnvHKMUMniFTuL/V6hwb5m1UCwWqW
HAnNA6mC5/mStLHq9yOVAdzzQ3shAg4UC7X+3eEPrbPOn53V7R93vNYbAoGBAPog
RVU4qHwBeW6Py8NXK9ZAJ5Nw1Nh+fmmc7mq9KFE4YPZNupEFAFc9LbhI9Hh1yud7
6lCVWuhJwtAcwpEQq1J88f8Ijl+Pk6YDICYb2cegLPpmLiz4DQcsiL6B0UGAmZnO
6xGitFLjrNWNOb/Vae0dxygN1z6r+wWoFnQEsZFpAoGBAIRMVv4EKBwBzbJuRufy
hZvcr9lLf6mMSn6CGvn/D7rYVPwt1chEQ0cGZiE8tP8y92A5KtM3zul86XHCSRCd
JP9V6SglIlr4WBINjhKmCNBQfOYPkc6SWy1/edK+Q3N5NvAjoSyMvHKxen1KJT8u
qg3C0Ux3a2ZCIjqeL2ZLRKzJAoGBAMLPDZEBbuAeOditsFL0+tSE5Q4FrBDt/ED/
lAWYS+VuVr6e7XbzgT9xC8HjOFz1yVGfhnC60rHmeQ+jxro7VGQLomMy48hzx9hd
yNVFjcnX7BAeM0qc63Cx89MEwtkUcw2DRjxXD8EbSEqPEvJhIn4mWi3NEd7jDcBr
GQnFehM5AoGAfxYCOfdbzXEjhMxEquIvNpKhWCVhBYeGOdNpF3NlI8xUGKydbj1p
Vl5yI6fsR/jdDG1OcW3NNDpzRIXAKqYkALlqiqsZecE8YwIEcS41VOurk5Xaxx+v
2I9ZRjFGnKuDx3/Ol+OBEB+Jf2lrbXgvqDTu+2QtHpF5MR1Mfdlr1KA=
-----END RSA PRIVATE KEY-----
53 changes: 53 additions & 0 deletions test/tracing/https_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
'use strict';

var expect = require('chai').expect;

var supportedVersion = require('../../src/tracing/index').supportedVersion;
var agentStubControls = require('../apps/agentStubControls');
var expressControls = require('../apps/expressControls');
var config = require('../config');
var utils = require('../utils');

describe('tracing/https', function() {
if (!supportedVersion(process.versions.node)) {
return;
}

this.timeout(config.getTestTimeout());

agentStubControls.registerTestHooks();
expressControls.registerTestHooks({
useHttps: true
});

beforeEach(function() {
return agentStubControls.waitUntilAppIsCompletelyInitialized(expressControls.getPid());
});

it('must trace incoming HTTPS calls', function() {
return expressControls.sendRequest({
method: 'POST',
path: '/checkout',
responseStatus: 201,
useHttps: true
})
.then(function() {
return utils.retry(function() {
return agentStubControls.getSpans()
.then(function(spans) {
expect(spans.length).to.equal(1);

var span = spans[0];
expect(span.n).to.equal('node.http.server');
expect(span.async).to.equal(false);
expect(span.error).to.equal(false);
expect(span.ec).to.equal(0);
expect(span.data.http.method).to.equal('POST');
expect(span.data.http.url).to.equal('/checkout');
expect(span.data.http.status).to.equal(201);
expect(span.data.http.host).to.equal('127.0.0.1:3211');
});
});
});
});
});