Skip to content
This repository has been archived by the owner on Sep 19, 2019. It is now read-only.

Commit

Permalink
Merge pull request #644 from blackflux/dev
Browse files Browse the repository at this point in the history
[Gally]: master <- dev
  • Loading branch information
simlu committed Sep 17, 2019
2 parents c3ac673 + 66a4123 commit e73d827
Show file tree
Hide file tree
Showing 16 changed files with 87 additions and 576 deletions.
42 changes: 2 additions & 40 deletions README.md
Expand Up @@ -11,44 +11,6 @@

Rollbar wrapper for Serverless, API Gateway and Lambda.

## Getting Started
# Deprecated

To install run `npm install --save lambda-rollbar`

## Usage

Define rollbar and wrap handlers with
<!-- eslint-disable import/no-extraneous-dependencies, import/no-unresolved -->
```javascript
const rollbar = require('lambda-rollbar')({
rollbar: {
accessToken: 'YOUR_ROLLBAR_ACCESS_TOKEN',
environment: 'YOUR_ENVIRONMENT',
enabled: true
},
template: 'aws-sls-lambda-proxy'
});

exports.handler = rollbar.wrap((event, context, rb) => rb
.warning('Some Warning...')
.then({ statusCode: 200, body: '{"message":"Hello World."}' }));
```

Available log levels are `debug`, `info`, `warning`, `error` and `critical`.

You can set an environment on a per call bases using `rb.warning("YOUR_MESSAGE", "YOUR_ENVIRONMENT")`.

## Verbose Option

Use the boolean `verbose` option to log messages to console. This option also get's passed through into [rollbar](https://github.com/rollbar/rollbar.js#verbose-option).

## Request Templates

Lambda functions are called in different [request context](https://rollbar.com/docs/notifier/rollbar.js/#rollbarlog-1). Using the `template` option you can define which request context should be assumed. Currently supported are:

- `aws-sls-lambda-proxy` (*default*) - Default event template for API Gateway using the [Serverless Framework](https://serverless.com/framework/docs/providers/aws/events/apigateway/)
- `aws-cloud-watch` - For [CloudWatch logs](http://docs.aws.amazon.com/lambda/latest/dg/eventsources.html#eventsources-cloudwatch-logs) events

## Contributions / What is next

- **Templates** - Adding more templates is easy and PRs are welcome! Sample events can be found [here](http://docs.aws.amazon.com/lambda/latest/dg/eventsources.html). Make sure you only use fields listed under [request](https://rollbar.com/docs/notifier/rollbar.js/#rollbarlog-1), i.e. `url`, `method`, `body`.
Deprecated: Please use lambda-async, lambda-monitor and lambda-monitor-logger instead
13 changes: 3 additions & 10 deletions package.json
Expand Up @@ -52,11 +52,9 @@
"eslint-plugin-json": "1.4.0",
"eslint-plugin-markdown": "1.0.0",
"eslint-plugin-mocha": "6.1.1",
"js-gardener": "2.0.96",
"node-tdd": "2.5.9",
"js-gardener": "2.0.97",
"nyc": "14.1.1",
"semantic-release": "15.13.24",
"uuid": "3.3.3"
"semantic-release": "15.13.24"
},
"licenses": [
{
Expand All @@ -70,12 +68,7 @@
"files": [
"lib"
],
"dependencies": {
"fast-safe-stringify": "2.0.7",
"joi-strict": "1.1.4",
"lodash.get": "4.4.2",
"rollbar": "2.13.0"
},
"dependencies": {},
"peerDependencies": {},
"nyc": {
"tempDir": "./coverage/.nyc_output",
Expand Down
107 changes: 2 additions & 105 deletions src/index.js
@@ -1,106 +1,3 @@
const fs = require('fs');
const path = require('path');
const get = require('lodash.get');
const Joi = require('joi-strict');
const Rollbar = require('rollbar');
const ensureString = require('./util/ensure-string');

const templates = (() => {
const templateDir = path.join(__dirname, 'templates');
return fs
.readdirSync(templateDir)
.map((f) => f.slice(0, -3))
.reduce((p, f) => Object.assign(p, {
// eslint-disable-next-line global-require,import/no-dynamic-require
[f]: require(path.join(templateDir, f))
}), {});
})();

module.exports = (options) => {
Joi.assert(options, Joi.object().keys({
rollbar: Joi.object().keys({
accessToken: Joi.string().optional(),
environment: Joi.string().optional(),
enabled: Joi.boolean().optional(),
verbose: Joi.boolean().optional(),
reportLevel: Joi.string().optional()
}).optional(),
template: Joi.string().optional()
}));
const rollbarOptions = get(options, 'rollbar', {});
const template = templates[get(options, 'template', 'aws-sls-lambda-proxy')];
const verbose = get(options, 'rollbar.verbose', false);
const rollbarEnvironment = get(options, 'rollbar.environment');
const rollbar = new Rollbar(rollbarOptions);

const submitToRollbar = async ({
error,
environment,
level,
event,
context
}) => {
const msgPrefix = [
get(error, 'statusCode'),
get(error, 'messageId')
].filter((e) => !['', undefined].includes(e)).join('@');
const msgBody = get(error, 'message') || ensureString(error);
const message = [msgPrefix, msgBody].filter((e) => !['', undefined].includes(e)).join(': ');
if (verbose === true) {
// eslint-disable-next-line no-console
console.log(message);
}
rollbar.configure({ payload: { environment } });
// reference: https://github.com/Rollbar/rollbar.js/#rollbarlog-1
rollbar[level](message, error, {
context: {
remainingTimeInMillis: context.getRemainingTimeInMillis(),
callbackWaitsForEmptyEventLoop: context.callbackWaitsForEmptyEventLoop,
functionName: context.functionName,
functionVersion: context.functionVersion,
arn: context.invokedFunctionArn,
requestId: context.awsRequestId,
logGroupName: context.logGroupName,
logStreamName: context.logStreamName,
invokeid: context.invokeid,
memoryLimitInMB: context.memoryLimitInMB
},
event
}, template(event));
return error;
};

/* Wrap Lambda function handler */
return {
wrap: (handler) => (event, context, callback) => {
// eslint-disable-next-line no-param-reassign
context.callbackWaitsForEmptyEventLoop = false;

// Rollbar logging levels as promise
const rb = ['debug', 'info', 'warning', 'error', 'critical']
.reduce((final, level) => Object.assign(final, {
[level]: (error, env = rollbarEnvironment) => submitToRollbar({
error, env, level, event, context
})
}), {});

try {
handler(event, context, rb)
.then((resp) => rollbar.wait(() => callback(null, resp)))
.catch((err) => {
try {
rb.error(err);
} finally {
rollbar.wait(() => callback(err));
}
});
} catch (err) {
try {
rb.error(err);
} finally {
rollbar.wait(() => callback(err));
}
}
}
};
module.exports = () => {
throw new Error('Deprecated: Please use lambda-async, lambda-monitor and lambda-monitor-logger instead');
};
24 changes: 0 additions & 24 deletions src/templates/aws-cloud-watch.js

This file was deleted.

17 changes: 0 additions & 17 deletions src/templates/aws-sls-lambda-proxy.js

This file was deleted.

3 changes: 0 additions & 3 deletions src/util/ensure-string.js

This file was deleted.

87 changes: 4 additions & 83 deletions test/index.spec.js
@@ -1,88 +1,9 @@
const expect = require('chai').expect;
const uuid = require('uuid/v4');
const { describe } = require('node-tdd');
const Rollbar = require('../src/index');

describe('Testing Rollbar Wrapper', { record: console, useNock: true }, () => {
let error;
let rollbarVerbose;
let rollbarNonVerbose;
let executeHandler;

before(() => {
error = new Error(uuid());
rollbarVerbose = Rollbar({
rollbar: {
accessToken: process.env.ACCESS_TOKEN,
environment: 'local',
enabled: true,
verbose: true
}
});
rollbarNonVerbose = Rollbar({
rollbar: {
accessToken: process.env.ACCESS_TOKEN,
environment: 'local',
enabled: true,
verbose: false
}
});
executeHandler = (err, resp) => new Promise((resolve) => {
const handler = rollbarVerbose.wrap(() => (err ? Promise.reject(err) : Promise.resolve(resp)));
handler(
{},
{ getRemainingTimeInMillis: () => 0 },
(err_, resp_) => {
resolve([err_, resp_]);
}
);
});
});

it('Testing Execution Without Error', async ({ recorder }) => {
const response = {
statusCode: 400,
body: '{"message":"Invalid Parameter."}'
};
const [err, resp] = await executeHandler(null, response);
expect(err).to.equal(null);
expect(resp).to.equal(response);
expect(recorder.get()).to.deep.equal([]);
});

it('Testing Execution With Error', async ({ recorder }) => {
const [err, resp] = await executeHandler(error, undefined);
expect(err).to.equal(error);
expect(resp).to.equal(undefined);
expect(recorder.get()).to.deep.equal([
error.message,
error,
'Successful api response. Link: https://rollbar.com/occurrence/uuid/?uuid=9320983b-22d4-4157-893a-79e02d6081bb'
]);
});

it('Testing Execution With String Error Message', async ({ recorder }) => {
const [err, resp] = await executeHandler('String Error', undefined);
expect(err).to.equal('String Error');
expect(resp).to.equal(undefined);
expect(recorder.get()).to.deep.equal([
'String Error',
'String Error',
'Successful api response. Link: https://rollbar.com/occurrence/uuid/?uuid=d56af703-6de0-4cf7-fce7-942fb9564467'
]);
});

it('Testing Exception Verbose', async ({ capture, recorder }) => {
await capture(() => new Promise((resolve, reject) => rollbarVerbose.wrap(() => {
throw error;
})({}, { getRemainingTimeInMillis: () => 0 }, reject)));
expect(recorder.get()).to.deep.equal([error.message, error]);
});

it('Testing Exception Non-Verbose', async ({ capture, recorder }) => {
await capture(() => new Promise((resolve, reject) => rollbarNonVerbose.wrap(() => {
throw error;
})({}, { getRemainingTimeInMillis: () => 0 }, reject)));
expect(recorder.get()).to.deep.equal([]);
describe('Testing Rollbar', () => {
it('Testing Deprecated', async () => {
expect(() => Rollbar())
.to.throw('Deprecated: Please use lambda-async, lambda-monitor and lambda-monitor-logger instead');
});
});
1 change: 0 additions & 1 deletion test/index.spec.js.env.yml

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

0 comments on commit e73d827

Please sign in to comment.