Query Defects and Root Causes
This query example demonstrates how to retrieve the first 20 high-severity, active defects and root causes from the Causely platform using the GraphQL utilities defined above.
note
The START_TIME is set to the current time in UTC. You may need to adjust the timestamp to your needs.
Prerequisite
This example reuses the helper utilities defined in the Authentication and GraphQL Clients sections—fetching an access token, creating the GraphQL client, and sending a request with the post_query wrapper (CLI, Python, or Go). Keep those helpers in scope before running this query.
- python
- javascript
- bash
- go
- graphql
import os
from datetime import datetime, timezone
if __name__ == "__main__":
# Get credentials from environment
cid, secret = os.getenv("CAUSELY_CLIENT_ID"), os.getenv("CAUSELY_CLIENT_SECRET")
if not cid or not secret:
raise EnvironmentError("Missing CAUSELY_CLIENT_ID or CAUSELY_CLIENT_SECRET")
# Get access token and create GraphQL client
token = get_causely_access_token(cid, secret)
client = create_graphql_client(token)
# Prepare query variables
start_time = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S") + ".000+00:00"
variables = {
"defectFilter": {
"state": "ACTIVE",
"severities": ["Critical", "High"],
"startTime": start_time,
"scopesFilter": {"scopes": []},
"entityTypes": [],
"defectNames": [],
"entityName": ""
},
"groupRecurring": True,
"first": 20
}
# Execute the query
query = """
fragment LabelFragment on Label { key value __typename }
fragment BasicEntityWithLabelsFragment on Entity { id name typeName labels { ...LabelFragment __typename } __typename }
fragment DefectFragment on Defect { id name fromTime toTime remediated serviceCount entityId entityType entity { ...BasicEntityWithLabelsFragment __typename } activeCount missingCount severity __typename }
fragment DefectRelatedOccurrencesFragment on Defect { relatedOccurrrences { id name fromTime toTime entity { id name typeName __typename } severity __typename } __typename }
fragment BasicEntityFragment on Entity { id name typeName __typename }
fragment SymptomFragmentWithoutLabels on Symptom { id name active state entityId entityType fromTime toTime isPropagated entity { ...BasicEntityFragment __typename } __typename }
fragment EventFragmentWithoutLabels on Event { id name active time entity { ...BasicEntityFragment __typename } __typename }
query defectConnection($defectFilter: DefectFilter, $groupRecurring: Boolean, $first: Int, $after: String, $last: Int, $before: String) {
defectConnection(defectFilter: $defectFilter groupRecurring: $groupRecurring first: $first after: $after last: $last before: $before) {
totalCount edges { node { ...DefectFragment ...DefectRelatedOccurrencesFragment symptoms { ...SymptomFragmentWithoutLabels __typename } events { ...EventFragmentWithoutLabels __typename } __typename } cursor __typename }
pageInfo { hasNextPage hasPreviousPage startCursor endCursor totalCount __typename } __typename
}
}
"""
result = post_query(client, query, variables)
print(result)
const { CAUSELY_CLIENT_ID, CAUSELY_CLIENT_SECRET } = process.env;
if (!CAUSELY_CLIENT_ID || !CAUSELY_CLIENT_SECRET) {
console.error('Missing CAUSELY_CLIENT_ID or CAUSELY_CLIENT_SECRET');
process.exit(1);
}
(async () => {
try {
// Get access token and create GraphQL client
const token = await getCauselyAccessToken(CAUSELY_CLIENT_ID, CAUSELY_CLIENT_SECRET);
const client = createGraphQLClient(token);
// Prepare query variables
const startTime = new Date().toISOString().replace(/\.\d+Z$/, '.000+00:00');
const variables = {
defectFilter: {
state: 'ACTIVE',
severities: ['Critical', 'High'],
startTime,
scopesFilter: { scopes: [] },
entityTypes: [],
defectNames: [],
entityName: '',
},
groupRecurring: true,
first: 20,
};
// Execute the query
const query = `
fragment LabelFragment on Label { key value __typename }
fragment BasicEntityWithLabelsFragment on Entity { id name typeName labels { ...LabelFragment __typename } __typename }
fragment DefectFragment on Defect { id name fromTime toTime remediated serviceCount entityId entityType entity { ...BasicEntityWithLabelsFragment __typename } activeCount missingCount severity __typename }
fragment DefectRelatedOccurrencesFragment on Defect { relatedOccurrrences { id name fromTime toTime entity { id name typeName __typename } severity __typename } __typename }
fragment BasicEntityFragment on Entity { id name typeName __typename }
fragment SymptomFragmentWithoutLabels on Symptom { id name active state entityId entityType fromTime toTime isPropagated entity { ...BasicEntityFragment __typename } __typename }
fragment EventFragmentWithoutLabels on Event { id name active time entity { ...BasicEntityFragment __typename } __typename }
query defectConnection($defectFilter: DefectFilter, $groupRecurring: Boolean, $first: Int, $after: String, $last: Int, $before: String) {
defectConnection(defectFilter: $defectFilter groupRecurring: $groupRecurring first: $first after: $after last: $last before: $before) {
totalCount edges { node { ...DefectFragment ...DefectRelatedOccurrencesFragment symptoms { ...SymptomFragmentWithoutLabels __typename } events { ...EventFragmentWithoutLabels __typename } __typename } cursor __typename }
pageInfo { hasNextPage hasPreviousPage startCursor endCursor totalCount __typename } __typename
}
}
`;
const result = await postQuery(client, query, variables);
console.log(JSON.stringify(result, null, 2));
} catch (err) {
console.error('Error:', err.message);
process.exit(1);
}
})();
# Set up credentials and get token
export CAUSELY_CLIENT_ID=<YOUR_CLIENT_ID>
export CAUSELY_CLIENT_SECRET=<YOUR_CLIENT_SECRET>
export CAUSELY_ACCESS_TOKEN=$(response=$(curl -s -w "\n%{http_code}" -X POST https://auth.causely.app/frontegg/identity/resources/auth/v2/api-token \
-H "Content-Type: application/json" \
-d "{\"clientId\": \"${CAUSELY_CLIENT_ID}\", \"secret\": \"${CAUSELY_CLIENT_SECRET}\"}"); \
http_code=$(echo "$response" | tail -n1); \
body=$(echo "$response" | sed '$d'); \
if [ "$http_code" = "200" ]; then echo "$body" | jq -r .access_token; else echo "$body" >&2; false; fi)
# Create query and variables files
cat > defect_query.graphql << 'EOF'
fragment LabelFragment on Label { key value __typename }
fragment BasicEntityWithLabelsFragment on Entity { id name typeName labels { ...LabelFragment __typename } __typename }
fragment DefectFragment on Defect { id name fromTime toTime remediated serviceCount entityId entityType entity { ...BasicEntityWithLabelsFragment __typename } activeCount missingCount severity __typename }
fragment DefectRelatedOccurrencesFragment on Defect { relatedOccurrrences { id name fromTime toTime entity { id name typeName __typename } severity __typename } __typename }
fragment BasicEntityFragment on Entity { id name typeName __typename }
fragment SymptomFragmentWithoutLabels on Symptom { id name active state entityId entityType fromTime toTime isPropagated entity { ...BasicEntityFragment __typename } __typename }
fragment EventFragmentWithoutLabels on Event { id name active time entity { ...BasicEntityFragment __typename } __typename }
query defectConnection($defectFilter: DefectFilter, $groupRecurring: Boolean, $first: Int, $after: String, $last: Int, $before: String) {
defectConnection(defectFilter: $defectFilter groupRecurring: $groupRecurring first: $first after: $after last: $last before: $before) {
totalCount edges { node { ...DefectFragment ...DefectRelatedOccurrencesFragment symptoms { ...SymptomFragmentWithoutLabels __typename } events { ...EventFragmentWithoutLabels __typename } __typename } cursor __typename }
pageInfo { hasNextPage hasPreviousPage startCursor endCursor totalCount __typename } __typename
}
}
EOF
START_TIME="$(TZ=UTC date +%Y-%m-%dT%H:%M:%S).000+00:00"
cat > variables.json << EOF
{
"defectFilter": {
"state": "ACTIVE",
"severities": ["Critical", "High"],
"startTime": "${START_TIME}",
"scopesFilter": {"scopes": []},
"entityTypes": [],
"defectNames": [],
"entityName": ""
},
"groupRecurring": true,
"first": 20
}
EOF
# Execute the query using gq (if available) or curl
if command -v gq &> /dev/null; then
post_query "defect_query.graphql" "variables.json"
else
query=$(cat defect_query.graphql | tr '\n' ' ')
variables=$(cat variables.json)
post_query_curl "$query" "$variables"
fi
# Clean up temporary files
rm -f defect_query.graphql variables.json
package main
import (
"fmt"
"os"
"time"
)
func main() {
// Get credentials from environment
id, secret := os.Getenv("CAUSELY_CLIENT_ID"), os.Getenv("CAUSELY_CLIENT_SECRET")
if id == "" || secret == "" {
fmt.Fprintln(os.Stderr, "Missing CAUSELY_CLIENT_ID or CAUSELY_CLIENT_SECRET")
os.Exit(1)
}
// Get access token and create GraphQL client
token, err := getToken(id, secret, "https://auth.causely.app/frontegg/identity/resources/auth/v2/api-token")
if err != nil {
fmt.Fprintln(os.Stderr, "Error getting token:", err)
os.Exit(1)
}
client := createGraphQLClient(token)
// Prepare query variables
startTime := time.Now().UTC().Format("2006-01-02T15:04:05") + ".000+00:00"
variables := map[string]interface{}{
"defectFilter": map[string]interface{}{
"state": "ACTIVE",
"severities": []string{"Critical", "High"},
"startTime": startTime,
"scopesFilter": map[string]interface{}{"scopes": []string{}},
"entityTypes": []string{},
"defectNames": []string{},
"entityName": "",
},
"groupRecurring": true,
"first": 20,
}
// Execute the query
query := `fragment LabelFragment on Label { key value __typename } fragment BasicEntityWithLabelsFragment on Entity { id name typeName labels { ...LabelFragment __typename } __typename } fragment DefectFragment on Defect { id name fromTime toTime remediated serviceCount entityId entityType entity { ...BasicEntityWithLabelsFragment __typename } activeCount missingCount severity __typename } fragment DefectRelatedOccurrencesFragment on Defect { relatedOccurrrences { id name fromTime toTime entity { id name typeName __typename } severity __typename } __typename } fragment BasicEntityFragment on Entity { id name typeName __typename } fragment SymptomFragmentWithoutLabels on Symptom { id name active state entityId entityType fromTime toTime isPropagated entity { ...BasicEntityFragment __typename } __typename } fragment EventFragmentWithoutLabels on Event { id name active time entity { ...BasicEntityFragment __typename } __typename } query defectConnection($defectFilter: DefectFilter, $groupRecurring: Boolean, $first: Int, $after: String, $last: Int, $before: String) { defectConnection(defectFilter: $defectFilter groupRecurring: $groupRecurring first: $first after: $after last: $last before: $before) { totalCount edges { node { ...DefectFragment ...DefectRelatedOccurrencesFragment symptoms { ...SymptomFragmentWithoutLabels __typename } events { ...EventFragmentWithoutLabels __typename } __typename } cursor __typename } pageInfo { hasNextPage hasPreviousPage startCursor endCursor totalCount __typename } __typename } }`
result, err := postQuery(client, query, variables)
if err != nil {
fmt.Fprintln(os.Stderr, "Error running query:", err)
os.Exit(1)
}
fmt.Println(result)
}
First, let's define the GraphQL query and variables:
fragment LabelFragment on Label {
key
value
__typename
}
fragment BasicEntityWithLabelsFragment on Entity {
id
name
typeName
labels {
...LabelFragment
__typename
}
__typename
}
fragment DefectFragment on Defect {
id
name
fromTime
toTime
remediated
serviceCount
entityId
entityType
entity {
...BasicEntityWithLabelsFragment
__typename
}
activeCount
missingCount
severity
__typename
}
fragment DefectRelatedOccurrencesFragment on Defect {
relatedOccurrrences {
id
name
fromTime
toTime
entity {
id
name
typeName
__typename
}
severity
__typename
}
__typename
}
fragment BasicEntityFragment on Entity {
id
name
typeName
__typename
}
fragment SymptomFragmentWithoutLabels on Symptom {
id
name
active
state
entityId
entityType
fromTime
toTime
isPropagated
entity {
...BasicEntityFragment
__typename
}
__typename
}
fragment EventFragmentWithoutLabels on Event {
id
name
active
time
entity {
...BasicEntityFragment
__typename
}
__typename
}
query defectConnection(
$defectFilter: DefectFilter
$groupRecurring: Boolean
$first: Int
$after: String
$last: Int
$before: String
) {
defectConnection(
defectFilter: $defectFilter
groupRecurring: $groupRecurring
first: $first
after: $after
last: $last
before: $before
) {
totalCount
edges {
node {
...DefectFragment
...DefectRelatedOccurrencesFragment
symptoms {
...SymptomFragmentWithoutLabels
__typename
}
events {
...EventFragmentWithoutLabels
__typename
}
__typename
}
cursor
__typename
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
totalCount
__typename
}
__typename
}
}