# elastic-apm-nest

> Elastic APM for NestJS

Latest version **0.0.7** (published 2020-05-01) · 0 weekly downloads

## Install

```sh
npm install elastic-apm-nest
pnpm add elastic-apm-nest
yarn add elastic-apm-nest
bun add elastic-apm-nest
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.7 |
| Published | 2020-05-01 |
| First published | 2020-02-15 |
| Weekly downloads | 0 |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >= 10.15.1 |
| Dependencies | 4 |
| Unpacked size | 73.3 KB |
| Known vulnerabilities | 0 (+3 in 2 direct dependencies) |
| Install scripts | no |
| Author | Krzysztof Szostak |
| Maintainers | hejker |

## Links

- npm: https://www.npmjs.com/package/elastic-apm-nest
- Homepage: https://github.com/hejkerooo/nestjs-apm
- npm.io page: https://npm.io/package/elastic-apm-nest

## Dependencies (4)

- [@nestjs/core](https://npm.io/package/@nestjs/core.md) ^7.0.3
- [@nestjs/common](https://npm.io/package/@nestjs/common.md) ^7.0.3
- [elastic-apm-node](https://npm.io/package/elastic-apm-node.md) ^3.3.0
- [reflect-metadata](https://npm.io/package/reflect-metadata.md) ^0.1.13

## Recent versions

- 0.0.7 (latest) — 2020-05-01
- 0.0.6 — 2020-03-19
- 0.0.5 — 2020-02-17
- 0.0.3 — 2020-02-17
- 0.0.2 — 2020-02-15

## README

# elastic-apm-nest
[NestJS](https://github.com/nestjs/nest) Elastic APM library.

## Installation
`npm i elastic-apm-nest --save`

## Usage
To your `tsconfig.json` add following lines:
```json
"paths": {
      "elastic-apm-node": [
        "./node_modules/elastic-apm-nest/types/elastic-apm-node/index.d.ts"
      ]
    }
```

If your `baseUrl` in `tsconfig.json` is set to some directory, remember to change the path of `elastic-apm-node` 

For example if your `baseUrl: "./src"` you need to replace `.` with `..`
```json
"paths": {
      "elastic-apm-node": [
        "../node_modules/elastic-apm-nest/types/elastic-apm-node/index.d.ts"
      ]
    }
```

```typescript

import { APM_MIDDLEWARE, ApmErrorInterceptor, ApmHttpUserContextInterceptor, initializeAPMAgent } from 'elastic-apm-nest';

initializeAPMAgent({
  serviceName: '',
  secretToken: '',
  serverUrl: '',
});

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const apmMiddleware = app.get(APM_MIDDLEWARE);
  const globalInterceptors = [
    app.get(ApmHttpUserContextInterceptor),
    app.get(ApmErrorInterceptor),
  ];

  app.useGlobalInterceptors(... globalInterceptors);

  app.use(apmMiddleware);
  await app.listen(3000);
}
bootstrap();
```

As NestJS is not allowing you to use some sort of `ConfigService` there you need to add to your repository [dotenv](https://www.npmjs.com/package/dotenv) package or something similar to pass configuration.

## Adding ApmModule

```typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ApmModule } from 'elastic-apm-nest';

@Module({
  imports: [
    ApmModule.forRootAsync({
      useFactory: async () => {
        return {
          httpUserMapFunction: (req: any) => {
            return {
              id: req.user.id,
              username: req.user.username,
              email: req.user.email,
            };
          },
        };
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
```

## Module exports
`ApmService` - Wrapper for raw APM Agent instance
`APM_INSTANCE` - Raw APM Agent instance
`APM_MIDDLEWARE` - APM Raw Http middleware for express
`APM_OPTIONS` - Current configuration for elastic-apm-nest

## APM Decorator

There is possibility to use `ApmCurrentTransaction` to inject current transaction

```typescript
  @HttpCode(200)
  @Get('/hello-world')
  getHelloWorld(
    @ApmCurrentTransaction()
    transaction: Transaction,
  ): string {
    return this.appService.getHello();
  }
```

## Default ApmHttpUserContextInterceptor behavior
It won't set UserContext in transaction if `httpUserMapFunction` is not provided

## Handling not supported methods
You can inject `APM_INSTANCE` which contains created APM instance via `initializeAPMAgent` function.

### Testing locally
- Run `npm run build:test`
- Copy absolute path to generated `.tgz` file
- Run in other project `npm install <path_to_.tgz_file>`

### ToDo
- [] Improve tests
- [] Add examples
- [] Add renovate
- [x] Improve typings for elastic-apm

---
_Source: https://npm.io/package/elastic-apm-nest · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
