DEV Community

Cover image for Incident Intelligence: Connecting Atlassian Opsgenie to Cognee AI Memory & Knowledge Graphs
Pranjul Chaurasiya
Pranjul Chaurasiya

Posted on Edited on

Incident Intelligence: Connecting Atlassian Opsgenie to Cognee AI Memory & Knowledge Graphs

When high-severity incidents (P1/P2) trigger in production, engineering teams are inundated with fragmented information: fired alert payloads, escalation hops, on-call rotation schedules, and post-incident Slack threads.

Traditional Retrieval-Augmented Generation (RAG) fails in incident response because incidents are fundamentally relational:

  • Which on-call engineer was paged when the authentication microservice breached latency thresholds?
  • Has this specific database failover happened before across our escalation policies?
  • What services depend on the upstream system currently firing alerts?

To answer these questions, AI systems need more than simple vector similarity over flat text—they need GraphRAG (Knowledge Graph RAG).

As part of the WeMakeDevs × Cognee Mergetober Hackathon, I built and submitted the Atlassian Opsgenie data-source connector (cognee-community-connector-opsgenie) for Cognee.

In this deep dive, we explore how to turn Opsgenie alert streams, on-call schedules, and escalation trees into an active AI knowledge graph while adhering to strict security and lifecycle invariants.


Architecture: Real-Time SRE Memory

The Opsgenie connector bridges operational telemetry into Cognee’s semantic layer:

flowchart TD
    subgraph OpsgenieAPI ["Atlassian Opsgenie API"]
        A["/v2/alerts (P1-P5 Severities)"]
        B["/v2/schedules (On-Call Rotations)"]
        C["/v2/escalations (Routing Rules)"]
    end

    subgraph ConnectorGuard ["Connector Security & Hygiene"]
        D["SSRF Domain Validator (api.opsgenie.com / api.eu.opsgenie.com)"]
        E["Rate-Limit Backoff (Cap Retry-After at 60s)"]
        F["Credential Redaction (GenieKey & Auth Headers)"]
    end

    subgraph Formatting ["Document & Metadata Serialization"]
        G["Alert Markdown Documents + Entity Properties"]
        H["On-Call Schedule & Participant Trees"]
        I["Escalation Policy Nodes"]
    end

    subgraph CogneeEngine ["Cognee GraphRAG Pipeline"]
        J["dlt Source (DOCUMENT_SOURCE_ATTR='opsgenie')"]
        K["Cognify Pipeline (LLM Entity/Relation Extraction)"]
        L["Vector Store (Embeddings)"]
        M["Knowledge Graph (FalkorDB / NetworkX)"]
        N["Orphan Pruning (Forget-on-Delete)"]
    end

    A & B & C --> D --> E --> F
    F --> G & H & I --> J
    J --> K
    K --> L & M
    J --> N

1. Multi-Resource Ingestion: Alerts, On-Call, & Escalations

Opsgenie is not just a stream of alerts; it represents the operational topology of your engineering organization. The connector structures three distinct resources:

A. Alert Telemetry (opsgenie_alerts)

Ingests active and historical alerts, extracting priority (P1 through P5), status (open, acknowledged, closed), tags, source integrations, responder notes, and diagnostic details.

# Opsgenie Alert: Database Connection Pool Exhausted (P1 - CRITICAL)
- **Alert ID:** `4a9b...`
- **Status:** open
- **Created At:** 2026-10-31T20:15:00Z
- **Responders:** SRE-Platform-Team
- **Tags:** `database`, `postgres`, `payment-gateway`
- **Description:** Active connections reached 100% capacity on primary read-write cluster.
Enter fullscreen mode Exit fullscreen mode

B. On-Call Rotations (opsgenie_schedules)

Ingests schedules, rotation layers (weekly/daily/custom), timezones, and active on-call participants. This allows Cognee to correlate who was on shift during an incident window.

C. Escalation Routing (opsgenie_escalations)

Maps out escalation policies, delay intervals, repeat counts, and notification rules across user and team targets.


2. Hardened Production Security & Maintainer Invariants

Building enterprise connectors requires battle-tested engineering. Here are the core patterns implemented to meet Cognee maintainer review standards:

SSRF & Domain Validation

When traversing pagination links or following @odata.nextLink / next URLs, the client explicitly validates hostnames before attaching credentials:

from urllib.parse import urlparse

ALLOWED_HOSTS = {"api.opsgenie.com", "api.eu.opsgenie.com"}

def validate_target_url(url: str) -> str:
    parsed = urlparse(url)
    if parsed.scheme != "https":
        raise ValueError(f"Insecure scheme: {parsed.scheme}. HTTPS required.")
    if parsed.hostname not in ALLOWED_HOSTS:
        raise ValueError(f"SSRF violation: Host {parsed.hostname} is not an authorized Opsgenie endpoint.")
    return url
Enter fullscreen mode Exit fullscreen mode

Sanitized Error Messaging (Zero Leaks in Sentry/Logs)

HTTP error bodies can contain echoed bearer tokens or sensitive system parameters. The connector never dumps raw HTTP bodies into exceptions:

def raise_sanitized_error(response):
    # Safe error message with HTTP status code only
    msg = f"Opsgenie API error: HTTP {response.status_code} ({response.reason_phrase})"
    err = OpsgenieAPIError(msg)
    # Store scrubbed details privately without exposing to standard str(err)
    err.status_code = response.status_code
    raise err
Enter fullscreen mode Exit fullscreen mode

Capped Retry-After Handling

Unbounded retry loops can hold process-wide staging locks in distributed environments. If Opsgenie returns an HTTP 429 with Retry-After: 300, sleeping for 5 minutes can cause downstream deadlocks. The connector caps backoffs to a maximum of 60 seconds:

def calculate_retry_delay(response) -> float:
    header = response.headers.get("Retry-After")
    if header and header.isdigit():
        return min(float(header), 60.0)
    return 2.0
Enter fullscreen mode Exit fullscreen mode

3. The "Forget-on-Delete" Invariant in Action

Incident management data is ephemeral: alerts close, schedules rotate, and temporary escalations expire. If an AI memory system retains resolved or deleted alerts forever, retrieval precision degrades.

By configuring:

setattr(source, DOCUMENT_SOURCE_ATTR, "opsgenie")
Enter fullscreen mode Exit fullscreen mode

and tagging resources with:

write_disposition="replace"
Enter fullscreen mode Exit fullscreen mode

Cognee's ingestion engine recognizes when an alert is resolved or deleted upstream. During synchronization, Cognee computes the snapshot delta and triggers automatic orphan cleanup, pruning stale entities and edges from FalkorDB/NetworkX and Qdrant without corrupting existing historical relationships.


Quickstart: SRE Knowledge Graph in 40 Lines of Python

Here is how you can index your active Opsgenie alerts and on-call schedules into Cognee:

import asyncio
import os
import cognee
from cognee_community_connector_opsgenie import opsgenie_source

async def main():
    # 1. Configure the Opsgenie source
    # Filters to open high-priority alerts while syncing active schedules
    source = opsgenie_source(
        api_key=os.environ["OPSGENIE_API_KEY"],
        base_url="https://api.opsgenie.com",
        query="status: open AND priority: P1",
        include_schedules=True,
        include_escalations=True,
    )

    # 2. Add to Cognee memory and build the Knowledge Graph
    print("Ingesting Opsgenie telemetry...")
    await cognee.add(source)

    print("Running Cognify: Extracting SRE entities and building relationships...")
    await cognee.cognify()

    # 3. Query the SRE Memory
    query = "Who is currently on-call for critical P1 database alerts, and what is the escalation path?"
    print(f"\nQuerying Cognee: '{query}'")

    results = await cognee.search(query)
    for result in results:
        print(f"\n[Insight]: {result}")

if __name__ == "__main__":
    asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

What Happens Behind the Scenes?

During cognee.cognify(), Cognee extracts entity nodes like:

  • Alert("Database Connection Pool Exhausted")
  • Team("SRE-Platform-Team")
  • Person("Jane Doe", role="Primary On-Call")
  • EscalationRule("Step 1 -> Page Jane Doe; Step 2 (5 min) -> Page Platform Lead")

It establishes graph edges (ASSIGNED_TO, ESCALATES_TO, AFFECTS_SERVICE), enabling the LLM to give grounded, deterministic operational answers.


Verification & Code Quality

The connector is verified with a comprehensive offline test harness:

  • 14/14 Unit Tests Passing: Zero live network calls using respx HTTP mocking (tests/test_opsgenie.py).
  • CodeQL CLI Security Audit: 100% clean across 174 rules (python-security-and-quality.qls) with 0 CWE findings.
  • DCO Certified: Verified Developer Certificate of Origin (git commit -s).

Check Out the Code

The Atlassian Opsgenie connector is open for review in the Cognee Community ecosystem:

Building SRE agents or interested in GraphRAG for operations? Let me know your thoughts or feedback in the comments!

Top comments (0)