Skip to main content

Moderate Example

Moderate example for v3/tickets/query API - Complete pagination workflow.

This example demonstrates using OpenSearch filters and field selection to retrieve specific tickets across multiple pages using Point in Time (PIT) pagination.


Code Example​

import requests
import logging
from datetime import datetime, timedelta

# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# Configuration
BASE_URL = "https://your-api-base-url.com"
TOKEN_URL = "https://your-auth-endpoint.com/oauth2/token"
CLIENT_ID = "your-client-id"
CLIENT_SECRET = "your-client-secret"

def get_access_token():
"""Authenticate and get JWT access token."""
response = requests.post(
TOKEN_URL,
data={
"grant_type": "client_credentials",
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET
},
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
response.raise_for_status()
return response.json()["access_token"]

def fetch_tickets_with_pagination(access_token):
"""Fetch tickets using the query API with PIT pagination.

Returns all tickets matching the query by following pit_id/search_after pagination.
"""
url = f"{BASE_URL}/v3/tickets/query"
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
"client_id": CLIENT_ID
}

# Calculate time range (last 30 days)
end_time = datetime.utcnow()
start_time = end_time - timedelta(days=30)

# Initial request payload with filters and field selection
payload = {
"application": "atr",
"app_type": ["ec2", "kubernetes"],
"domain": ["*"],
"start_time": start_time.strftime("%Y-%m-%dT%H:%M:%SZ"),
"end_time": end_time.strftime("%Y-%m-%dT%H:%M:%SZ"),
"size": 1000,
"includes_eu": False,
"fields": [
"ticket.number",
"ticket.type",
"ticket.state",
"ticket.short_description",
"ticket.resolved",
"atr.domain_name"
],
"filters": [
{
"term": {"ticket.resolved": True}
}
]
}

all_tickets = []
page = 1

logger.info(f"Fetching tickets from {start_time} to {end_time}...")
logger.info("Filter: resolved tickets only")

while True:
logger.info(f"Fetching page {page}...")

response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
data = response.json()

hits = data.get("data", {}).get("hits", [])
all_tickets.extend(hits)
logger.info(f"Retrieved {len(hits)} tickets (total: {len(all_tickets)})")

# Check pagination
pagination = data.get("meta", {}).get("pagination", {})
pit_id = pagination.get("pit_id")
search_after = pagination.get("search_after")

if not pit_id or not search_after:
logger.info("Last page reached.")
break

# Build pagination request
payload = {
"pit_id": pit_id,
"search_after": search_after,
"size": 1000,
"fields": [
"ticket.number",
"ticket.type",
"ticket.state",
"ticket.short_description",
"ticket.resolved",
"atr.domain_name"
]
}

page += 1

return all_tickets

def main():
"""Main execution."""
logger.info("=" * 60)
logger.info("v3/tickets/query API Example")
logger.info("=" * 60)

# Step 1: Get access token
logger.info("1. Authenticating...")
try:
access_token = get_access_token()
logger.info("Authentication successful")
except Exception as e:
logger.error(f"Authentication failed: {e}")
return

# Step 2: Fetch tickets with pagination
logger.info("2. Fetching tickets...")
try:
tickets = fetch_tickets_with_pagination(access_token)
logger.info(f"Successfully retrieved {len(tickets)} total tickets")
except Exception as e:
logger.error(f"Failed to fetch tickets: {e}")
return

# Step 3: Process results
logger.info("3. Sample results:")
for i, hit in enumerate(tickets[:3], 1):
source = hit.get("_source", {})
ticket = source.get("ticket", {})
atr = source.get("atr", {})
logger.info(f"Ticket {i}:")
logger.info(f" - Number: {ticket.get('number', 'N/A')}")
logger.info(f" - Type: {ticket.get('type', 'N/A')}")
logger.info(f" - State: {ticket.get('state', 'N/A')}")
logger.info(f" - Description: {ticket.get('short_description', 'N/A')}")
logger.info(f" - Domain: {atr.get('domain_name', 'N/A')}")

if len(tickets) > 3:
logger.info(f"... and {len(tickets) - 3} more tickets")

logger.info("=" * 60)
logger.info("Complete!")
logger.info("=" * 60)

if __name__ == "__main__":
main()