# MFab::Plugin::Datadog

A comprehensive Mojolicious plugin that provides deep integration with Datadog's Application Performance Monitoring (APM) system. This plugin automatically instruments your Mojolicious applications to provide detailed performance insights and distributed tracing capabilities.

## Key Features

- **Automatic Request Tracing**: Every HTTP request is automatically traced with detailed timing information
- **Distributed Tracing**: Seamlessly propagates trace context across service boundaries
- **Custom Span Support**: API for adding custom spans to track specific operations
- **Real-time Metrics**: Monitor application performance in real-time through Datadog's dashboard
- **Zero-Configuration**: Works out of the box with sensible defaults
- **Production Ready**: Battle-tested in production environments

## Example webserver

See the `example/` directory

## Installation

`cpanm --install .`

## Usage

To use the plugin in your Mojolicious application, add it to your `startup` method:

```perl
package MyApp;
use Mojo::Base qw(Mojolicious -signatures);

sub startup ($self) {
    # Add MFab::Plugins to the plugin namespace search
    push(@{ $self->plugins->namespaces }, 'MFab::Plugins');

    # Load the Datadog plugin
    $self->plugin('Datadog', { enabled => "true" });

    # Other startup code...
}
```

## Configuration

The plugin accepts the following configuration options:

- `datadogHost` - the datadog agent host, also looks in the ENV for `DD_AGENT_HOST`, defaults to `localhost`
- `enabled` - should we send traces to datadog, also looks in the ENV for `DD_TRACE_ENABLED`, defaults to `false`
- `serviceEnv` - the value to send to datadog for the service environment, defaults to `test`

## Features

- **Metrics Collection**: Automatically collect and send metrics to Datadog APM.
- **Datadog APM Ecosystem**: Automatically uses the Datadog headers to trace cross-app requests
- **Custom Metrics**: Define and send custom metrics from your application.

## Custom Metrics

In Datadog, traces can contain multiple spans. Each span can have a parent to describe the relationship between them. In order to include your own spans in the trace, they need to be associated with the Mojolicious transaction. Below is an example:

```perl
package MyWebserverApp;
use MFab::Plugins::Datadog qw(startSpan endSpan);
use Mojo::Base qw(Mojolicious::Controller -signatures);

sub request ($c) {
    my $span = startSpan($c->tx, "MyWebserverApp::request", "/requesturl");
    # process request
    $c->render(text => "Done");
    endSpan($span);
}
```

By default, the parent is associated with the active Mojolicious hook spans. You can also pass in a span to startSpan to use as the parent if you have one

## Contributing

1. Fork the repository.
2. Create a new branch (`git checkout -b feature-branch`).
3. Commit your changes (`git commit -am 'Add new feature'`).
4. Push to the branch (`git push origin feature-branch`).
5. Create a new Pull Request.

## Acknowledgments

- [Mojolicious](https://mojolicious.org/)
- [Datadog](https://www.datadoghq.com/)