> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Active Job

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

<VersionRequirements
  versions={[
{ name: "AppSignal for Ruby", version: "2.11.0" }
]}
/>

Active Job is een framework voor het declareren van jobs en het uitvoeren ervan op een verscheidenheid aan queuing-backends die met Rails worden meegeleverd.

De Active Job-integratie trackt de uitvoering en events van de uitgevoerde job.

Wanneer AppSignal Active Job-metrics detecteert, maakt het een [Magic Dashboard](#magic-dashboard) aan, zodat u kernmetrics visueel kunt monitoren.

## Ondersteunde adapters

De Active Job-integratie ondersteunt alle [Active Job-adapters](https://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).

Het kan ook ondersteuning bieden voor adapters die niet op die pagina worden vermeld en die toegankelijk zijn via een aparte gem. Houd er echter rekening mee dat deze adapters niet getest zijn.

## Integratie met door AppSignal ondersteunde libraries

De volgende background job-libraries die AppSignal ondersteunt, worden automatisch geïntegreerd met Active Job, waardoor AppSignal u diepgaandere performance-inzichten kan geven:

* [Delayed::Job](/ruby/integrations/delayed-job)
* [Que](/ruby/integrations/que)
* [Resque](/ruby/integrations/resque)
* [Sidekiq](/ruby/integrations/sidekiq)
* [Solid Queue](/ruby/integrations/solidqueue)

## Errors rapporteren bij job-discard

<Compatibility
  versions={[
{ name: "AppSignal for Ruby", version: "3.7.3" },
{ name: "Active Job", version: "7.1.0" },
]}
/>

Zet de [`activejob_report_errors` config-optie](/ruby/configuration/options#option-activejob_report_errors) op `discard` om alleen errors te rapporteren wanneer een job wordt weggegooid. Wanneer een job wordt weggegooid, zijn alle retry-pogingen uitgeput en wordt de job niet meer opnieuw geprobeerd. Lees de [Active Job-documentatie](https://guides.rubyonrails.org/active_job_basics.html#exceptions) voor meer informatie over Active Job exception handling en mislukte job-retries.

<CodeGroup>
  ```ruby Ruby theme={null}
  class ExampleJob < ActiveJob::Base
    # Configure the retry attempts using the `retry_on` method
    retry_on StandardError, :attempts => 2

    # ...
  end
  ```
</CodeGroup>

<Warning>
  Sommige Active Job-adapters (zoals Sidekiq, Delayed::Job, enz.) hebben hun eigen
  retry-systeem. Nadat Active Job zijn retries heeft uitgeput, kunnen deze libraries
  hun eigen job-retry-systeem activeren.

  Dit retryt jobs zelfs nadat Active Job zijn retries heeft uitgeput en
  de job heeft weggegooid. Om te voorkomen dat jobs opnieuw worden geprobeerd nadat Active Job is gestopt
  met retrying en dat er errors voor die retries worden gerapporteerd, zorgt u ervoor dat het
  retry-systeem van de adapter is uitgeschakeld.

  Wanneer u vertrouwt op het retry-systeem van Sidekiq, configureer het dan ook om
  [alleen errors te rapporteren bij discard](/ruby/integrations/sidekiq#report-errors-on-job-discard),
  zodat er geen meerdere keren errors worden gerapporteerd.
</Warning>

## Metadata

AppSignal verzamelt de volgende metadata voor Active Job-jobs:

| Metadata        | Beschrijving                                                                                   |
| --------------- | ---------------------------------------------------------------------------------------------- |
| Active Job ID   | De Active Job-ID die door de Active Job-adapter wordt gerapporteerd.                           |
| Arguments       | Argumenten doorgegeven aan de job bij het aanroepen van `perform_later`.                       |
| Events          | Alle `*.active_job` events.                                                                    |
| Job-naam        | bv. `MyBackgroundJob#perform` zoals gebruikt om de job voor AppSignal-incidenten te groeperen. |
| Priority        | De prioriteit van de sample, als een adapter wordt gebruikt die job-prioriteit ondersteunt.    |
| Provider job ID | De job-ID die door de Active Job-adapter wordt gerapporteerd.                                  |
| Queue           | De queue-naam van de sample, als een adapter wordt gebruikt die meerdere queues ondersteunt.   |
| Queue time\*    | Verstreken tijd vanaf het in de queue plaatsen van een job tot de uitvoering.                  |

*\*Vanaf Rails versie 6 worden queue times gerapporteerd voor de namespace waaruit ze worden gerapporteerd en kunnen ze worden bekeken in AppSignal's [Performance Graphs](https://appsignal.com/redirect-to/app?to=performance/graphs).*

AppSignal gebruikt Active Job-metadata om u diepere contextuele inzichten te geven in job-performance. Bij het inspecteren van Active Job-samples in AppSignal:

* De job-naam wordt gebruikt om de job voor AppSignal-incidenten te groeperen:

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/active-job/job-performance-samples.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=866403a09bc23c27704ecd4ac96dc1c7" alt="Example performance issues overview" width="983" height="362" data-path="assets/images/screenshots/ruby/integrations/active-job/job-performance-samples.png" />

* Metadata (behalve job-naam en events) is beschikbaar als filterbare tags op incident-samples:

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/active-job/job-tags.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=35ac92fc750684d84cf17fa9ed4244c5" alt="Example Active Job tags" width="1432" height="672" data-path="assets/images/screenshots/ruby/integrations/active-job/job-tags.png" />

* `*.active_job` events worden weergegeven in de event timeline voor performance-samples:

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/active-job/job-event-timeline.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=920c59814955e89708efb652d5d13cfd" alt="Example Event timeline" width="1314" height="488" data-path="assets/images/screenshots/ruby/integrations/active-job/job-event-timeline.png" />

## Magic dashboard

Wanneer AppSignal Active Job-metrics ontvangt, maakt het een Active Job magic dashboard aan, beschikbaar vanuit de dashboard-sectie van de AppSignal-app.

Het Active Job magic dashboard bevat de volgende grafieken:

| Grafiek                                                                          | Metrics                      | [Tags](#tags)                                        |
| -------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------- |
| [Duur per job-klasse](#duration-per-job-class-graph)                             | `transaction_duration`       | <li>`namespace`</li><li>`action`</li>                |
| [Job-status per queue](#job-status-per-queue-graph)                              | `active_job_queue_job_count` | <li>`status`</li><li>`queue`</li>                    |
| [Job-status per queue met prioriteit](#job-status-per-queue-with-priority-graph) | `active_job_queue_job_count` | <li>`status`</li><li>`queue`</li><li>`priority`</li> |
| [Throughput per job-klasse](#throughput-per-job-class-graph)                     | `transaction_duration`       | <li>`namespace`</li><li>`action`</li>                |

Tags geven u een contextuele uitsplitsing van Active Job-performance-informatie; momenteel rapporteert AppSignal de volgende tags voor Active Job-jobs:

| Naam       | Beschrijving                                                                                                         |
| ---------- | -------------------------------------------------------------------------------------------------------------------- |
| `action`   | De naam van de actie waaruit de metric werd gerapporteerd (bv.: `YourWorker#perform`).                               |
| `queue`    | Genoemde queue waarin jobs worden verwerkt, bv. `default` of `mailer`.                                               |
| `status`   | Status van elke job, ofwel `processed` of `failed`. <br />Jobs die `failed` zijn, worden ook geteld als `processed`. |
| `priority` | De prioriteit die aan elke job is toegekend, bv. `0` of `1`.                                                         |

Elke tag wordt vertegenwoordigd door een gekleurde lijn op de grafiek:

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/active-job/dashboard.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=a5675ac1b157ee8ba348e3a1563b5793" alt="Example Actie Job dashboard" width="1432" height="672" data-path="assets/images/screenshots/ruby/integrations/active-job/dashboard.png" />

### Duur-per-job-klasse-grafiek

De Duur-per-job-klasse-grafiek toont de hoeveelheid tijd die jobs nodig hadden om te worden uitgevoerd, gegroepeerd op de klasse die de job definieert.

U kunt deze grafiek gebruiken om de performance van jobs per klasse te monitoren, wat u een overzicht geeft van de job-performance en u in staat stelt om snel pieken in de uitvoeringstijd te identificeren en te onderzoeken.

### Job-status-per-queue-grafiek

De Job-status-per-queue-met-prioriteit-grafiek toont het aantal jobs dat werd uitgevoerd, gegroepeerd op hun resulterende status, op de queue waarin ze in de wachtrij werden geplaatst.

U kunt deze grafiek gebruiken om job-error-aantallen en performance te monitoren op basis van queue, knelpunten te identificeren en uw background jobs te optimaliseren voor schaalbaarheid.

### Job-status-per-queue-met-prioriteit-grafiek

<Tip>
  Niet alle [Active Job-adapters](#supported-adapters) ondersteunen job-prioriteit. Als
  jobs geen prioriteitswaarden hebben, is de grafiek leeg.
</Tip>

De Job-status-per-queue-met-een-prioriteit-grafiek toont het aantal jobs dat werd uitgevoerd,
gegroepeerd op hun resulterende status op de queue waarin ze in de wachtrij werden geplaatst, en op
de prioriteit die aan hen werd toegekend.

U kunt deze grafiek gebruiken om job-error-aantallen en performance te monitoren op basis van queue en prioriteit, knelpunten te identificeren en uw background jobs te optimaliseren voor schaalbaarheid.

### Throughput-per-job-klasse-grafiek

De Throughput-per-job-klasse-grafiek toont het aantal jobs dat werd uitgevoerd, gegroepeerd op de klasse die de job definieert.

U kunt deze grafiek gebruiken om te monitoren hoeveel jobs er worden uitgevoerd, gegroepeerd op de klasse die de job definieert.
