mirror of
https://github.com/taylanbakircioglu/flowfish.git
synced 2026-09-16 07:35:17 +00:00
6e503368f7
- Grafana Beyla DaemonSet for kernel-level HTTP/gRPC/DNS capture (passive, zero application changes, W3C traceparent header propagation) - flowfish-l7-collector in-cluster bridge: OTLP receiver + buffered pull API - L7 Ingestion Service: K8s service-proxy poll → enrich → RabbitMQ - ClickHouse l7_http_flows / l7_grpc_flows / l7_dns_flows + APM RED MVs - Neo4j L7Workload nodes + SAME_WORKLOAD cross-cluster bridges - New pages: Service Map, Trace Explorer, APM Services List, APM Service Detail - Analysis Wizard now supports L4 / L7 / Both modes with HTTP/gRPC/DNS picks - Integration Hub gains L7 dependency summary + tree-summary integrations - Multi-Cluster Management: dual-agent install (Inspector Gadget L4 + Beyla L7), runtime OpenShift detection so SCCs auto-install with kubectl too - ServiceMap edge → Trace Explorer drill-down with virtual_trace_id correlation - Docs: new L7 architecture diagram, README L7 sections, 3 new screenshots
2149 lines
58 KiB
YAML
2149 lines
58 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: Flowfish Platform API
|
|
description: |
|
|
# Flowfish Platform API
|
|
|
|
REST API documentation for the eBPF-based Kubernetes/OpenShift application communication and dependency mapping platform.
|
|
|
|
## Key Features
|
|
|
|
- **Automatic Discovery** — Automatically detect inter-pod communications using eBPF
|
|
- **Real-Time Dependency Map** — Live visualization of service dependency graphs
|
|
- **Anomaly Detection** — Intelligent anomaly detection powered by statistical analysis
|
|
- **Multi-Cluster** — Manage multiple clusters from a single interface
|
|
- **Integration** — Dependency intelligence APIs for CI/CD pipeline integration
|
|
- **Pod & Deployment Annotations** — Rich metadata enrichment including annotations merged from owning Deployments/StatefulSets
|
|
- **Import/Export** — Data import and export in multiple formats
|
|
|
|
## Authentication
|
|
|
|
The API supports two authentication methods:
|
|
|
|
1. **JWT (JSON Web Token)** — Send a POST request to `/api/v1/auth/login` with username and password, then include the returned `access_token` in subsequent requests via `Authorization: Bearer <token>` header.
|
|
2. **API Key** — Generate an API key from Settings > API Keys, then include it via `X-API-Key: <key>` header. Recommended for CI/CD pipelines and AI agent integrations.
|
|
|
|
## Rate Limiting
|
|
|
|
- **Authenticated Users**: 1,000 requests/hour
|
|
- **Unauthenticated**: 100 requests/hour
|
|
|
|
version: 1.0.0
|
|
contact:
|
|
name: Flowfish Team
|
|
email: support@flowfish.io
|
|
license:
|
|
name: MIT
|
|
url: https://opensource.org/licenses/MIT
|
|
|
|
servers:
|
|
- url: https://api.flowfish.io/api/v1
|
|
description: Production server
|
|
- url: https://staging.flowfish.io/api/v1
|
|
description: Staging server
|
|
- url: http://localhost:8000/api/v1
|
|
description: Development server
|
|
|
|
tags:
|
|
- name: Authentication
|
|
description: User authentication, JWT token management, and 2FA
|
|
- name: Users
|
|
description: User management and profile operations
|
|
- name: Clusters
|
|
description: Kubernetes/OpenShift cluster registration, connection, and management
|
|
- name: Analyses
|
|
description: Analysis wizard, lifecycle management, and run execution
|
|
- name: Workloads
|
|
description: Kubernetes workload inventory (Pod, Deployment, Service, StatefulSet) with labels and annotations
|
|
- name: Communications
|
|
description: Service-to-service communication records and dependency graphs
|
|
- name: Events
|
|
description: Time-series event queries and aggregations
|
|
- name: Integration
|
|
description: Dependency intelligence APIs for CI/CD pipeline integrations — dependency discovery, impact analysis, and cross-project dependency mapping
|
|
- name: Dependencies
|
|
description: Dependency map and graph queries
|
|
- name: Anomalies
|
|
description: Detected anomalies and outlier events
|
|
- name: Changes
|
|
description: Change detection and infrastructure drift tracking
|
|
- name: Baselines
|
|
description: Traffic baseline profiles
|
|
- name: Import/Export
|
|
description: Data import and export in CSV, JSON, and graph formats
|
|
- name: Settings
|
|
description: System configuration and enterprise settings
|
|
- name: L7 Communications
|
|
description: Application-layer (HTTP/gRPC/DNS) workload dependency graph from Beyla eBPF — isolated L7Workload graph in Neo4j
|
|
- name: L7 Events
|
|
description: L7 HTTP, gRPC, and DNS flow events and histograms from ClickHouse (Beyla-sourced)
|
|
|
|
components:
|
|
securitySchemes:
|
|
BearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
description: JWT token authorization header using the Bearer scheme
|
|
|
|
schemas:
|
|
Error:
|
|
type: object
|
|
required:
|
|
- error
|
|
- message
|
|
properties:
|
|
error:
|
|
type: string
|
|
example: "UNAUTHORIZED"
|
|
message:
|
|
type: string
|
|
example: "Invalid or expired token"
|
|
details:
|
|
type: object
|
|
nullable: true
|
|
|
|
Pagination:
|
|
type: object
|
|
properties:
|
|
page:
|
|
type: integer
|
|
minimum: 1
|
|
default: 1
|
|
page_size:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 100
|
|
default: 20
|
|
total_items:
|
|
type: integer
|
|
total_pages:
|
|
type: integer
|
|
|
|
User:
|
|
type: object
|
|
required:
|
|
- id
|
|
- username
|
|
- email
|
|
properties:
|
|
id:
|
|
type: integer
|
|
username:
|
|
type: string
|
|
email:
|
|
type: string
|
|
format: email
|
|
first_name:
|
|
type: string
|
|
nullable: true
|
|
last_name:
|
|
type: string
|
|
nullable: true
|
|
avatar_url:
|
|
type: string
|
|
format: uri
|
|
nullable: true
|
|
is_active:
|
|
type: boolean
|
|
roles:
|
|
type: array
|
|
items:
|
|
type: string
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
|
|
Cluster:
|
|
type: object
|
|
required:
|
|
- id
|
|
- name
|
|
- cluster_type
|
|
properties:
|
|
id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
cluster_type:
|
|
type: string
|
|
enum: [kubernetes, openshift]
|
|
api_url:
|
|
type: string
|
|
format: uri
|
|
is_active:
|
|
type: boolean
|
|
is_default:
|
|
type: boolean
|
|
kubernetes_version:
|
|
type: string
|
|
nullable: true
|
|
node_count:
|
|
type: integer
|
|
nullable: true
|
|
pod_count:
|
|
type: integer
|
|
nullable: true
|
|
namespace_count:
|
|
type: integer
|
|
nullable: true
|
|
health_status:
|
|
type: string
|
|
enum: [healthy, degraded, unhealthy, unknown]
|
|
last_sync_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
|
|
Namespace:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
cluster_id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
uid:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
status:
|
|
type: string
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
|
|
Workload:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
cluster_id:
|
|
type: integer
|
|
namespace_id:
|
|
type: integer
|
|
workload_type:
|
|
type: string
|
|
enum: [pod, deployment, statefulset, service]
|
|
name:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
annotations:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
ip_address:
|
|
type: string
|
|
format: ipv4
|
|
nullable: true
|
|
ports:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
port:
|
|
type: integer
|
|
protocol:
|
|
type: string
|
|
status:
|
|
type: string
|
|
first_seen:
|
|
type: string
|
|
format: date-time
|
|
last_seen:
|
|
type: string
|
|
format: date-time
|
|
is_active:
|
|
type: boolean
|
|
|
|
Communication:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
cluster_id:
|
|
type: integer
|
|
source_namespace:
|
|
type: string
|
|
source_workload:
|
|
type: string
|
|
source_workload_type:
|
|
type: string
|
|
destination_namespace:
|
|
type: string
|
|
destination_workload:
|
|
type: string
|
|
destination_workload_type:
|
|
type: string
|
|
destination_ip:
|
|
type: string
|
|
destination_port:
|
|
type: integer
|
|
protocol:
|
|
type: string
|
|
first_seen:
|
|
type: string
|
|
format: date-time
|
|
last_seen:
|
|
type: string
|
|
format: date-time
|
|
request_count:
|
|
type: integer
|
|
request_rate_per_second:
|
|
type: number
|
|
format: float
|
|
avg_latency_ms:
|
|
type: number
|
|
format: float
|
|
risk_score:
|
|
type: integer
|
|
minimum: 0
|
|
maximum: 100
|
|
risk_level:
|
|
type: string
|
|
enum: [low, medium, high, critical]
|
|
is_cross_namespace:
|
|
type: boolean
|
|
is_external:
|
|
type: boolean
|
|
is_active:
|
|
type: boolean
|
|
|
|
Analysis:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
cluster_id:
|
|
type: integer
|
|
scope_type:
|
|
type: string
|
|
enum: [cluster, namespace, deployment, pod, label]
|
|
scope_config:
|
|
type: object
|
|
gadget_modules:
|
|
type: array
|
|
items:
|
|
type: string
|
|
time_config:
|
|
type: object
|
|
output_config:
|
|
type: object
|
|
status:
|
|
type: string
|
|
enum: [draft, running, stopped, completed, failed]
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
|
|
Anomaly:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
cluster_id:
|
|
type: integer
|
|
anomaly_type:
|
|
type: string
|
|
severity:
|
|
type: string
|
|
enum: [low, medium, high, critical]
|
|
anomaly_score:
|
|
type: integer
|
|
minimum: 0
|
|
maximum: 100
|
|
title:
|
|
type: string
|
|
description:
|
|
type: string
|
|
affected_workloads:
|
|
type: array
|
|
items:
|
|
type: object
|
|
recommended_action:
|
|
type: string
|
|
status:
|
|
type: string
|
|
enum: [new, investigating, resolved, false_positive]
|
|
detected_at:
|
|
type: string
|
|
format: date-time
|
|
|
|
DependencyStreamCommunication:
|
|
type: object
|
|
properties:
|
|
protocol:
|
|
type: string
|
|
app_protocol:
|
|
type: string
|
|
service_type:
|
|
type: string
|
|
description: Detected service type (e.g. postgresql, kafka, redis)
|
|
service_category:
|
|
type: string
|
|
description: Service category (database, cache, message_broker, search_engine, etc.)
|
|
enum: [database, cache, message_broker, search_engine, service_discovery, identity, object_storage, observability, api_gateway, mail, dns, file_transfer, service]
|
|
is_critical:
|
|
type: boolean
|
|
description: Whether this dependency is classified as infrastructure-critical
|
|
port:
|
|
type: integer
|
|
request_count:
|
|
type: integer
|
|
error_rate_percent:
|
|
type: number
|
|
retransmit_count:
|
|
type: integer
|
|
avg_latency_ms:
|
|
type: number
|
|
|
|
DependencyHealth:
|
|
type: object
|
|
properties:
|
|
score:
|
|
type: integer
|
|
minimum: 0
|
|
maximum: 100
|
|
status:
|
|
type: string
|
|
enum: [healthy, degraded, unhealthy, critical]
|
|
error_rate_percent:
|
|
type: number
|
|
retransmit_rate_percent:
|
|
type: number
|
|
avg_latency_ms:
|
|
type: number
|
|
risk_factors:
|
|
type: array
|
|
items:
|
|
type: string
|
|
|
|
DependencyStreamPeer:
|
|
type: object
|
|
properties:
|
|
hop_count:
|
|
type: integer
|
|
pod_name:
|
|
type: string
|
|
namespace:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
annotations:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
ip:
|
|
type: string
|
|
owner_kind:
|
|
type: string
|
|
owner_name:
|
|
type: string
|
|
communication:
|
|
$ref: '#/components/schemas/DependencyStreamCommunication'
|
|
health:
|
|
$ref: '#/components/schemas/DependencyHealth'
|
|
|
|
CommunicationsDependenciesBatchRequest:
|
|
type: object
|
|
required:
|
|
- services
|
|
properties:
|
|
analysis_id:
|
|
type: string
|
|
cluster_id:
|
|
type: string
|
|
services:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
pod_name:
|
|
type: string
|
|
namespace:
|
|
type: string
|
|
owner_name:
|
|
type: string
|
|
label_key:
|
|
type: string
|
|
label_value:
|
|
type: string
|
|
annotation_key:
|
|
type: string
|
|
annotation_value:
|
|
type: string
|
|
ip:
|
|
type: string
|
|
depth:
|
|
type: integer
|
|
default: 1
|
|
include_communication_details:
|
|
type: boolean
|
|
default: true
|
|
|
|
CommunicationsDependenciesBatchResponse:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
service_count:
|
|
type: integer
|
|
results:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
shared_dependencies:
|
|
type: array
|
|
items:
|
|
type: string
|
|
|
|
CommunicationsDependenciesDiffResponse:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
service:
|
|
type: object
|
|
analysis_before:
|
|
type: object
|
|
analysis_after:
|
|
type: object
|
|
added_dependencies:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
removed_dependencies:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
changed_dependencies:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
unchanged_count:
|
|
type: integer
|
|
summary:
|
|
type: object
|
|
|
|
CommunicationsDependenciesImpactResponse:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
service:
|
|
type: object
|
|
dependencies:
|
|
type: object
|
|
properties:
|
|
downstream:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
callers:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
downstream_count:
|
|
type: integer
|
|
callers_count:
|
|
type: integer
|
|
impact_assessment:
|
|
type: object
|
|
properties:
|
|
risk_score:
|
|
type: integer
|
|
description: Risk score 0-100
|
|
risk_level:
|
|
type: string
|
|
enum: [low, medium, high, critical]
|
|
blast_radius:
|
|
type: integer
|
|
description: Total direct dependency count
|
|
critical_dependencies:
|
|
type: array
|
|
items:
|
|
type: string
|
|
description: List of critical service types (e.g. postgresql, redis)
|
|
recommendation:
|
|
type: string
|
|
enum: [proceed, caution, block]
|
|
suggested_actions:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
priority:
|
|
type: string
|
|
enum: [critical, high, medium, low]
|
|
action:
|
|
type: string
|
|
reason:
|
|
type: string
|
|
automatable:
|
|
type: boolean
|
|
change_type:
|
|
type: string
|
|
enum: [image_update, config_change, scale_change, delete]
|
|
|
|
DependencySummaryService:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
namespace:
|
|
type: string
|
|
kind:
|
|
type: string
|
|
annotations:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
is_critical:
|
|
type: boolean
|
|
service_type:
|
|
type: string
|
|
port:
|
|
type: integer
|
|
hop_count:
|
|
type: integer
|
|
description: Number of hops from the upstream service (1 = direct neighbor). Present when depth > 1.
|
|
|
|
DependencySummaryGroup:
|
|
type: object
|
|
properties:
|
|
total:
|
|
type: integer
|
|
critical_count:
|
|
type: integer
|
|
by_category:
|
|
type: object
|
|
additionalProperties:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/DependencySummaryService'
|
|
|
|
DependencySummary:
|
|
type: object
|
|
properties:
|
|
total_matched:
|
|
type: integer
|
|
description: Number of unique upstream workloads matched
|
|
total_downstream_unique:
|
|
type: integer
|
|
description: Unique downstream dependency count across all matched services
|
|
total_callers_unique:
|
|
type: integer
|
|
description: Unique caller count across all matched services
|
|
downstream_critical_count:
|
|
type: integer
|
|
description: Critical downstream dependency count (globally deduplicated)
|
|
callers_critical_count:
|
|
type: integer
|
|
description: Critical caller count (globally deduplicated)
|
|
|
|
MatchedService:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
namespace:
|
|
type: string
|
|
kind:
|
|
type: string
|
|
annotations:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
downstream:
|
|
$ref: '#/components/schemas/DependencySummaryGroup'
|
|
callers:
|
|
$ref: '#/components/schemas/DependencySummaryGroup'
|
|
|
|
DependencySummaryResponse:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
analysis_ids:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
multi_service:
|
|
type: boolean
|
|
description: True when multiple upstream workloads matched
|
|
summary:
|
|
$ref: '#/components/schemas/DependencySummary'
|
|
service:
|
|
$ref: '#/components/schemas/DependencySummaryService'
|
|
description: Aggregate service label. For single match shows actual service info; for multi-match shows summary label.
|
|
matched_services:
|
|
type: array
|
|
description: Each matched upstream workload with its own downstream/callers breakdown. Always present when success is true.
|
|
items:
|
|
$ref: '#/components/schemas/MatchedService'
|
|
error:
|
|
type: string
|
|
|
|
GraphData:
|
|
type: object
|
|
properties:
|
|
nodes:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
type:
|
|
type: string
|
|
name:
|
|
type: string
|
|
namespace:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
annotations:
|
|
type: object
|
|
additionalProperties:
|
|
type: string
|
|
metadata:
|
|
type: object
|
|
edges:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
source:
|
|
type: string
|
|
target:
|
|
type: string
|
|
port:
|
|
type: integer
|
|
protocol:
|
|
type: string
|
|
metrics:
|
|
type: object
|
|
|
|
security:
|
|
- BearerAuth: []
|
|
|
|
paths:
|
|
/auth/login:
|
|
post:
|
|
tags:
|
|
- Authentication
|
|
summary: User login
|
|
description: Authenticate with username and password to obtain a JWT access token
|
|
security: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- username
|
|
- password
|
|
properties:
|
|
username:
|
|
type: string
|
|
password:
|
|
type: string
|
|
format: password
|
|
examples:
|
|
example1:
|
|
summary: Admin user
|
|
value:
|
|
username: "admin"
|
|
password: "admin123"
|
|
responses:
|
|
'200':
|
|
description: Login successful
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
access_token:
|
|
type: string
|
|
token_type:
|
|
type: string
|
|
example: "bearer"
|
|
expires_in:
|
|
type: integer
|
|
example: 3600
|
|
user:
|
|
$ref: '#/components/schemas/User'
|
|
'401':
|
|
description: Invalid username or password
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/auth/me:
|
|
get:
|
|
tags:
|
|
- Authentication
|
|
summary: Get current user info
|
|
description: Returns user information decoded from the JWT token
|
|
responses:
|
|
'200':
|
|
description: User details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/User'
|
|
'401':
|
|
description: Invalid or missing token
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/clusters:
|
|
get:
|
|
tags:
|
|
- Clusters
|
|
summary: List clusters
|
|
description: Lists all clusters the authenticated user has access to
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
default: 1
|
|
- name: page_size
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 100
|
|
default: 20
|
|
- name: is_active
|
|
in: query
|
|
schema:
|
|
type: boolean
|
|
responses:
|
|
'200':
|
|
description: Cluster list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Cluster'
|
|
pagination:
|
|
$ref: '#/components/schemas/Pagination'
|
|
|
|
post:
|
|
tags:
|
|
- Clusters
|
|
summary: Add new cluster
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- name
|
|
- cluster_type
|
|
- api_url
|
|
properties:
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
cluster_type:
|
|
type: string
|
|
enum: [kubernetes, openshift]
|
|
api_url:
|
|
type: string
|
|
format: uri
|
|
kubeconfig:
|
|
type: string
|
|
description: Base64 encoded kubeconfig
|
|
responses:
|
|
'201':
|
|
description: Cluster created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Cluster'
|
|
'400':
|
|
description: Invalid request
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
/clusters/{cluster_id}:
|
|
get:
|
|
tags:
|
|
- Clusters
|
|
summary: Get cluster details
|
|
parameters:
|
|
- name: cluster_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Cluster details
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Cluster'
|
|
'404':
|
|
description: Cluster not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Error'
|
|
|
|
put:
|
|
tags:
|
|
- Clusters
|
|
summary: Update cluster
|
|
parameters:
|
|
- name: cluster_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
is_active:
|
|
type: boolean
|
|
responses:
|
|
'200':
|
|
description: Cluster updated
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Cluster'
|
|
|
|
delete:
|
|
tags:
|
|
- Clusters
|
|
summary: Delete cluster
|
|
parameters:
|
|
- name: cluster_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'204':
|
|
description: Cluster deleted
|
|
'404':
|
|
description: Cluster not found
|
|
|
|
/analyses:
|
|
get:
|
|
tags:
|
|
- Analyses
|
|
summary: List analyses
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: status
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [draft, running, stopped, completed, failed]
|
|
responses:
|
|
'200':
|
|
description: Analysis list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Analysis'
|
|
|
|
post:
|
|
tags:
|
|
- Analyses
|
|
summary: Create new analysis
|
|
description: Defines a new analysis using configuration from the wizard
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- name
|
|
- cluster_id
|
|
- scope_type
|
|
- scope_config
|
|
- gadget_modules
|
|
- time_config
|
|
- output_config
|
|
properties:
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
cluster_id:
|
|
type: integer
|
|
scope_type:
|
|
type: string
|
|
enum: [cluster, namespace, deployment, pod, label]
|
|
scope_config:
|
|
type: object
|
|
gadget_modules:
|
|
type: array
|
|
items:
|
|
type: string
|
|
time_config:
|
|
type: object
|
|
properties:
|
|
mode:
|
|
type: string
|
|
enum: [continuous, time_bound, scheduled, baseline]
|
|
duration_minutes:
|
|
type: integer
|
|
schedule:
|
|
type: string
|
|
output_config:
|
|
type: object
|
|
properties:
|
|
dashboards:
|
|
type: array
|
|
items:
|
|
type: string
|
|
llm_enabled:
|
|
type: boolean
|
|
alerts_enabled:
|
|
type: boolean
|
|
responses:
|
|
'201':
|
|
description: Analysis created
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/Analysis'
|
|
|
|
/analyses/{analysis_id}/start:
|
|
post:
|
|
tags:
|
|
- Analyses
|
|
summary: Start analysis
|
|
parameters:
|
|
- name: analysis_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Analysis started
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
message:
|
|
type: string
|
|
run_id:
|
|
type: integer
|
|
|
|
/analyses/{analysis_id}/stop:
|
|
post:
|
|
tags:
|
|
- Analyses
|
|
summary: Stop analysis
|
|
parameters:
|
|
- name: analysis_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Analysis stopped
|
|
|
|
/workloads:
|
|
get:
|
|
tags:
|
|
- Workloads
|
|
summary: List workloads
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: workload_type
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [pod, deployment, statefulset, service]
|
|
- name: is_active
|
|
in: query
|
|
schema:
|
|
type: boolean
|
|
default: true
|
|
responses:
|
|
'200':
|
|
description: Workload list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Workload'
|
|
|
|
/communications:
|
|
get:
|
|
tags:
|
|
- Communications
|
|
summary: List communication records
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: source_workload
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: destination_workload
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: risk_level
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [low, medium, high, critical]
|
|
- name: is_active
|
|
in: query
|
|
schema:
|
|
type: boolean
|
|
default: true
|
|
- name: from_time
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
- name: to_time
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
responses:
|
|
'200':
|
|
description: Communication records
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Communication'
|
|
total_count:
|
|
type: integer
|
|
|
|
/dependencies/graph:
|
|
get:
|
|
tags:
|
|
- Dependencies
|
|
summary: Get dependency map
|
|
description: Returns the dependency map as a graph with nodes and edges
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
description: Optional; used for filtering in multi-cluster scenarios
|
|
schema:
|
|
type: integer
|
|
- name: analysis_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: depth
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
default: 2
|
|
- name: search
|
|
in: query
|
|
schema:
|
|
type: string
|
|
minLength: 3
|
|
responses:
|
|
'200':
|
|
description: Graph data
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/GraphData'
|
|
|
|
/events/histogram:
|
|
get:
|
|
tags:
|
|
- Events
|
|
summary: Event time histogram
|
|
description: Returns event counts aggregated into time buckets for the given range and filters
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: analysis_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: event_types
|
|
in: query
|
|
schema:
|
|
type: string
|
|
description: Comma-separated event type identifiers
|
|
- name: start_time
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
- name: end_time
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
- name: bucket_count
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
responses:
|
|
'200':
|
|
description: Histogram buckets and metadata
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
buckets:
|
|
type: array
|
|
items:
|
|
type: object
|
|
additionalProperties: true
|
|
time_range:
|
|
type: object
|
|
additionalProperties: true
|
|
interval_seconds:
|
|
type: number
|
|
total_events:
|
|
type: integer
|
|
|
|
/communications/dependencies/stream:
|
|
get:
|
|
tags:
|
|
- Integration
|
|
- Communications
|
|
summary: Get pod dependencies as upstream/downstream
|
|
description: |
|
|
Query pod dependencies using any identifying information (annotation, label,
|
|
pod name, namespace, IP). The matched pod is treated as the upstream service.
|
|
Pods it communicates with are returned as downstream. Pods that connect to it
|
|
are returned as callers. Annotations include merged Deployment/StatefulSet metadata.
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: cluster_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: pod_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: owner_name
|
|
in: query
|
|
description: Deployment/StatefulSet/DaemonSet name
|
|
schema:
|
|
type: string
|
|
- name: annotation_key
|
|
in: query
|
|
description: "Annotation key to match. Supports * wildcard (e.g. mycompany.com/*)"
|
|
schema:
|
|
type: string
|
|
- name: annotation_value
|
|
in: query
|
|
description: "Annotation value to match. Supports * wildcard: * for any value, prefix* for startsWith"
|
|
schema:
|
|
type: string
|
|
- name: label_key
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: label_value
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: ip
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: depth
|
|
in: query
|
|
description: |
|
|
Graph traversal depth (1-5 hops). Default 1 returns direct neighbors only.
|
|
Higher values discover indirect (transitive) dependencies with hop_count metadata.
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 5
|
|
default: 1
|
|
- name: format
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [json, mermaid, dot]
|
|
default: json
|
|
responses:
|
|
'200':
|
|
description: Upstream pod and its downstream dependencies
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
count:
|
|
type: integer
|
|
results:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
upstream:
|
|
type: object
|
|
properties:
|
|
pod_name:
|
|
type: string
|
|
namespace:
|
|
type: string
|
|
labels:
|
|
type: object
|
|
annotations:
|
|
type: object
|
|
ip:
|
|
type: string
|
|
owner_kind:
|
|
type: string
|
|
owner_name:
|
|
type: string
|
|
downstream:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/DependencyStreamPeer'
|
|
callers:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/DependencyStreamPeer'
|
|
|
|
/communications/dependencies/batch:
|
|
post:
|
|
tags:
|
|
- Integration
|
|
- Communications
|
|
summary: Batch query dependencies for multiple services
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CommunicationsDependenciesBatchRequest'
|
|
responses:
|
|
'200':
|
|
description: Batch dependency results
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CommunicationsDependenciesBatchResponse'
|
|
|
|
/communications/dependencies/diff:
|
|
get:
|
|
tags:
|
|
- Integration
|
|
- Communications
|
|
summary: Get dependency diff between two analyses
|
|
parameters:
|
|
- name: analysis_id_before
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: analysis_id_after
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: pod_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: owner_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: cluster_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Dependency diff result
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CommunicationsDependenciesDiffResponse'
|
|
|
|
/communications/dependencies/impact:
|
|
get:
|
|
tags:
|
|
- Integration
|
|
- Communications
|
|
summary: Dependency impact analysis by change type
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: cluster_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: pod_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: owner_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: annotation_key
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: annotation_value
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: label_key
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: label_value
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: ip
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: depth
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 5
|
|
default: 1
|
|
- name: change_type
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [image_update, config_change, scale_change, delete]
|
|
default: image_update
|
|
responses:
|
|
'200':
|
|
description: Impact analysis result
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/CommunicationsDependenciesImpactResponse'
|
|
|
|
/communications/dependencies/summary:
|
|
get:
|
|
tags:
|
|
- Integration
|
|
summary: Per-service dependency summary grouped by category for CI/CD and AI integration
|
|
description: |
|
|
Returns a per-service dependency breakdown for CI/CD pipelines, AI agents, and automation.
|
|
Each matched upstream workload includes its own downstream and callers grouped by service_category.
|
|
A top-level summary provides globally deduplicated aggregate counts.
|
|
Dependencies include hop_count when depth > 1 to distinguish direct from indirect paths.
|
|
Annotations and labels are exposed for cross-project impact analysis (e.g. git-repo URLs, team info).
|
|
Requires at least one analysis_id and one search parameter.
|
|
parameters:
|
|
- name: analysis_ids
|
|
in: query
|
|
required: true
|
|
description: Analysis IDs (at least one required)
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
minItems: 1
|
|
- name: cluster_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: pod_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: owner_name
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: annotation_key
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: annotation_value
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: label_key
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: label_value
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: ip
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: depth
|
|
in: query
|
|
description: |
|
|
Graph traversal depth (1-5 hops). Default 1 returns direct neighbors only.
|
|
Higher values discover indirect (transitive) dependencies. Each dependency's hop_count
|
|
field indicates how many hops it is from the upstream service.
|
|
schema:
|
|
type: integer
|
|
minimum: 1
|
|
maximum: 5
|
|
default: 1
|
|
responses:
|
|
'200':
|
|
description: Per-service dependency breakdown with aggregate summary
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/DependencySummaryResponse'
|
|
|
|
/anomalies:
|
|
get:
|
|
tags:
|
|
- Anomalies
|
|
summary: List anomalies
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
schema:
|
|
type: integer
|
|
- name: severity
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [low, medium, high, critical]
|
|
- name: status
|
|
in: query
|
|
schema:
|
|
type: string
|
|
enum: [new, investigating, resolved, false_positive]
|
|
- name: from_date
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date
|
|
responses:
|
|
'200':
|
|
description: Anomaly list
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/Anomaly'
|
|
|
|
/export/csv:
|
|
get:
|
|
tags:
|
|
- Import/Export
|
|
summary: Export in CSV format
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
- name: namespace
|
|
in: query
|
|
schema:
|
|
type: string
|
|
- name: from_time
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
- name: to_time
|
|
in: query
|
|
schema:
|
|
type: string
|
|
format: date-time
|
|
responses:
|
|
'200':
|
|
description: CSV file
|
|
content:
|
|
text/csv:
|
|
schema:
|
|
type: string
|
|
|
|
/export/graph-json:
|
|
get:
|
|
tags:
|
|
- Import/Export
|
|
summary: Export in Graph JSON format
|
|
parameters:
|
|
- name: cluster_id
|
|
in: query
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
responses:
|
|
'200':
|
|
description: Graph JSON file
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
|
|
/import:
|
|
post:
|
|
tags:
|
|
- Import/Export
|
|
summary: Import data
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
multipart/form-data:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- file
|
|
- cluster_id
|
|
- import_mode
|
|
properties:
|
|
file:
|
|
type: string
|
|
format: binary
|
|
cluster_id:
|
|
type: integer
|
|
import_mode:
|
|
type: string
|
|
enum: [merge, overwrite, snapshot]
|
|
responses:
|
|
'202':
|
|
description: Import job started
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
job_id:
|
|
type: integer
|
|
message:
|
|
type: string
|
|
|
|
# ========================================================================
|
|
# L7 Communications (Beyla - Neo4j graph)
|
|
# ========================================================================
|
|
/l7/communications:
|
|
get:
|
|
tags: [L7 Communications]
|
|
summary: List L7 workload-to-workload communications
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
required: true
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: protocol
|
|
in: query
|
|
schema: { type: string, enum: [http, grpc, dns] }
|
|
- name: limit
|
|
in: query
|
|
schema: { type: integer, default: 100 }
|
|
responses:
|
|
'200':
|
|
description: L7 communication list
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/dependencies/graph:
|
|
get:
|
|
tags: [L7 Communications]
|
|
summary: L7 dependency graph (nodes and edges)
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
required: true
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: protocol
|
|
in: query
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Graph with L7Workload nodes and L7_COMMUNICATES_WITH edges
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/communications/stats:
|
|
get:
|
|
tags: [L7 Communications]
|
|
summary: Aggregated L7 communication statistics
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
required: true
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
responses:
|
|
'200':
|
|
description: Stats including total workloads, edges, requests, errors, avg latency
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/communications/error-stats:
|
|
get:
|
|
tags: [L7 Communications]
|
|
summary: L7 error totals and breakdown by protocol
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
required: true
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
responses:
|
|
'200':
|
|
description: Error stats per protocol
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/dependencies/summary:
|
|
get:
|
|
tags: [L7 Communications]
|
|
summary: Per-workload L7 dependency summary
|
|
description: |
|
|
Returns one entry per L7 workload (Beyla-observed application identity)
|
|
with aggregated inbound/outbound edge counts, request totals, error totals,
|
|
and error rate.
|
|
|
|
When any of `annotation_key`, `annotation_value`, `label_key`,
|
|
`label_value`, `owner_name`, `pod_name`, or `workload_name` is supplied,
|
|
the response narrows to matched workloads + their immediate neighbours
|
|
and each workload carries an `is_matched` flag. Glob patterns
|
|
(`*`, `?`, `[seq]`) are supported on annotation/label key and value
|
|
fields. `owner_name` is an L4-compatibility alias for `workload_name`.
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
required: true
|
|
description: Analysis ID; accepts the parent analysis ID or a multi-cluster sub-analysis ID
|
|
schema: { type: string }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: string }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: include_metadata
|
|
in: query
|
|
description: Include labels/annotations/owner_kind on each workload
|
|
schema: { type: string, default: 'true' }
|
|
- name: annotation_key
|
|
in: query
|
|
description: Filter by annotation key (fnmatch glob supported)
|
|
schema: { type: string }
|
|
- name: annotation_value
|
|
in: query
|
|
description: Filter by annotation value (fnmatch glob supported; omit for any-value)
|
|
schema: { type: string }
|
|
- name: label_key
|
|
in: query
|
|
schema: { type: string }
|
|
- name: label_value
|
|
in: query
|
|
schema: { type: string }
|
|
- name: owner_name
|
|
in: query
|
|
description: L4-compatibility alias for `workload_name`
|
|
schema: { type: string }
|
|
- name: pod_name
|
|
in: query
|
|
description: Case-insensitive substring match against workload name
|
|
schema: { type: string }
|
|
- name: workload_name
|
|
in: query
|
|
description: Case-insensitive substring match against L7Workload.name
|
|
schema: { type: string }
|
|
- name: filter_noise_annotations
|
|
in: query
|
|
description: Strip Kubernetes infrastructure annotations from response
|
|
schema: { type: boolean, default: false }
|
|
responses:
|
|
'200':
|
|
description: Per-workload inbound/outbound/request/error summary
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/dependencies/tree-summary:
|
|
get:
|
|
tags: [L7 Communications]
|
|
summary: L7 dependency tree with downstream/callers grouped by protocol
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
required: true
|
|
schema: { type: string }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: string }
|
|
- name: workload_name
|
|
in: query
|
|
schema: { type: string }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: depth
|
|
in: query
|
|
schema: { type: integer, default: 1, minimum: 1, maximum: 3 }
|
|
- name: label_key
|
|
in: query
|
|
schema: { type: string }
|
|
- name: label_value
|
|
in: query
|
|
schema: { type: string }
|
|
- name: annotation_key
|
|
in: query
|
|
schema: { type: string }
|
|
- name: annotation_value
|
|
in: query
|
|
schema: { type: string }
|
|
- name: include_metadata
|
|
in: query
|
|
schema: { type: string, default: 'true' }
|
|
- name: workload_name_exact
|
|
in: query
|
|
description: |
|
|
If true (default) match `workload_name` exactly. Pass false for
|
|
case-insensitive substring match (L4 `owner_name` parity).
|
|
schema: { type: boolean, default: true }
|
|
responses:
|
|
'200':
|
|
description: Tree-structured dependency summary
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
# ========================================================================
|
|
# L7 Events (Beyla - ClickHouse time-series)
|
|
# ========================================================================
|
|
/l7/events/http:
|
|
get:
|
|
tags: [L7 Events]
|
|
summary: Query L7 HTTP flow events
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: method
|
|
in: query
|
|
schema: { type: string }
|
|
- name: path
|
|
in: query
|
|
schema: { type: string }
|
|
- name: status_code
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: start_time
|
|
in: query
|
|
schema: { type: string, format: date-time }
|
|
- name: end_time
|
|
in: query
|
|
schema: { type: string, format: date-time }
|
|
- name: limit
|
|
in: query
|
|
schema: { type: integer, default: 100 }
|
|
- name: offset
|
|
in: query
|
|
schema: { type: integer, default: 0 }
|
|
responses:
|
|
'200':
|
|
description: Paginated HTTP flow events
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/events/grpc:
|
|
get:
|
|
tags: [L7 Events]
|
|
summary: Query L7 gRPC flow events
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: grpc_service
|
|
in: query
|
|
schema: { type: string }
|
|
- name: grpc_method
|
|
in: query
|
|
schema: { type: string }
|
|
- name: grpc_status_code
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: limit
|
|
in: query
|
|
schema: { type: integer, default: 100 }
|
|
- name: offset
|
|
in: query
|
|
schema: { type: integer, default: 0 }
|
|
responses:
|
|
'200':
|
|
description: Paginated gRPC flow events
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/events/dns:
|
|
get:
|
|
tags: [L7 Events]
|
|
summary: Query L7 DNS flow events
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: query_name
|
|
in: query
|
|
schema: { type: string }
|
|
- name: query_type
|
|
in: query
|
|
schema: { type: string }
|
|
- name: response_code
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: limit
|
|
in: query
|
|
schema: { type: integer, default: 100 }
|
|
- name: offset
|
|
in: query
|
|
schema: { type: integer, default: 0 }
|
|
responses:
|
|
'200':
|
|
description: Paginated DNS flow events
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/events/stats:
|
|
get:
|
|
tags: [L7 Events]
|
|
summary: Aggregate L7 event statistics across protocols
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: start_time
|
|
in: query
|
|
schema: { type: string, format: date-time }
|
|
- name: end_time
|
|
in: query
|
|
schema: { type: string, format: date-time }
|
|
responses:
|
|
'200':
|
|
description: Per-protocol event counts and totals
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|
|
|
|
/l7/events/histogram:
|
|
get:
|
|
tags: [L7 Events]
|
|
summary: L7 HTTP request histogram (5-min buckets)
|
|
parameters:
|
|
- name: analysis_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: cluster_id
|
|
in: query
|
|
schema: { type: integer }
|
|
- name: namespace
|
|
in: query
|
|
schema: { type: string }
|
|
- name: start_time
|
|
in: query
|
|
schema: { type: string, format: date-time }
|
|
- name: end_time
|
|
in: query
|
|
schema: { type: string, format: date-time }
|
|
- name: bucket_count
|
|
in: query
|
|
schema: { type: integer, default: 60, minimum: 1, maximum: 200 }
|
|
responses:
|
|
'200':
|
|
description: Time-bucketed request counts with error rates
|
|
content:
|
|
application/json:
|
|
schema: { type: object, additionalProperties: true }
|