Skip to content

Adding Query Validation Workflow #5514

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 34 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
6bcc8f2
Adding Query Validation Workflow
ntanwar-sumo Jun 23, 2025
187b52f
Merge branch 'main' into doc_pr_validations
ntanwar-sumo Jun 23, 2025
e645bf9
Potential fix for code scanning alert no. 10: Workflow does not conta…
ntanwar-sumo Jun 23, 2025
fac336c
changes
ntanwar-sumo Jun 23, 2025
088acb9
changes
ntanwar-sumo Jun 23, 2025
0e8ea7e
changes
ntanwar-sumo Jun 23, 2025
872b8d1
changes
ntanwar-sumo Jun 23, 2025
71268b6
changes
ntanwar-sumo Jun 23, 2025
6991012
changes
ntanwar-sumo Jun 23, 2025
ecd58ae
chnages-checking for incorrect query
ntanwar-sumo Jun 23, 2025
d2c9a2c
changes
ntanwar-sumo Jun 23, 2025
994b81a
changes
ntanwar-sumo Jun 23, 2025
2dc87df
changes
ntanwar-sumo Jun 24, 2025
18fda2d
changes
ntanwar-sumo Jun 24, 2025
318734d
Merge branch 'main' into doc_pr_validations
ntanwar-sumo Jun 24, 2025
2b09da4
changes
ntanwar-sumo Jun 25, 2025
b9c4d0e
Merge branch 'doc_pr_validations' of github.com:SumoLogic/sumologic-d…
ntanwar-sumo Jun 25, 2025
3b44020
changes
ntanwar-sumo Jun 25, 2025
db58bb8
Fix header update order in SumoLogicClient init
ntanwar-sumo Jun 25, 2025
f61e18b
changes
ntanwar-sumo Jun 25, 2025
95e4d85
changes
ntanwar-sumo Jun 25, 2025
ae88c80
changes
ntanwar-sumo Jul 8, 2025
52d50f1
chnages
ntanwar-sumo Jul 8, 2025
62433df
chnage
ntanwar-sumo Jul 8, 2025
1ddefbc
changes
ntanwar-sumo Jul 30, 2025
886d6db
New changes
ntanwar-sumo Jul 30, 2025
3eb3520
Updated changes
ntanwar-sumo Jul 30, 2025
458f024
new changes
ntanwar-sumo Jul 30, 2025
e4b7a76
changes
ntanwar-sumo Jul 30, 2025
a92d5a5
Changes
ntanwar-sumo Jul 30, 2025
09972fa
Add missing reducer functions to where operator documentation
ntanwar-sumo Jul 31, 2025
b631559
Fix validation script to only process changed files
ntanwar-sumo Jul 31, 2025
362d343
Fix SQL validation to exclude Markdown table content
ntanwar-sumo Jul 31, 2025
899c089
Add comprehensive debugging to identify file processing issue
ntanwar-sumo Jul 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/validate-queries.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Validate SQL Queries
on:
pull_request:
paths:
- 'docs/**/*.md' # Only trigger when documentation changes
- 'scripts/validate_*.py' # Or when validation scripts change

jobs:
validate-queries:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Required for git diff detection

- name: Debug filesystem
if: ${{ always() }}
run: |
echo "Workspace contents:"
ls -R
echo "Scripts directory:"
ls -la scripts/

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.10"

- name: Install dependencies
run: pip install requests pyyaml

- name: Validate queries
working-directory: ./scripts
env:
SUMO_LOGIC_ACCESS_ID: ${{ secrets.SUMO_LOGIC_ACCESS_ID }}
SUMO_LOGIC_ACCESS_KEY: ${{ secrets.SUMO_LOGIC_ACCESS_KEY }}
run: |
python validate_queries.py
46 changes: 46 additions & 0 deletions scripts/sumologic_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import os
import requests
from datetime import datetime, timedelta

class SumoLogicClient:
def __init__(self):
self.base_url = "https://api.sumologic.com/api/v1"
self.session = requests.Session()
self.session.auth = (
os.getenv("SUMO_LOGIC_ACCESS_ID"),
os.getenv("SUMO_LOGIC_ACCESS_KEY")
)

def test_query(self, query):
"""Execute a query in Sumo Logic and check for results"""
job_id = self._create_search_job(query)
status = self._wait_for_job(job_id)
return self._check_results(job_id) if status == "DONE GATHERING RESULTS" else False

def _create_search_job(self, query):
end_time = datetime.utcnow()
start_time = end_time - timedelta(hours=24)
payload = {
"query": query,
"from": start_time.isoformat() + "Z",
"to": end_time.isoformat() + "Z",
"timeZone": "UTC"
}
response = self.session.post(f"{self.base_url}/search/jobs", json=payload)
response.raise_for_status()
return response.json()["id"]

def _wait_for_job(self, job_id, max_attempts=10):
for _ in range(max_attempts):
response = self.session.get(f"{self.base_url}/search/jobs/{job_id}")
response.raise_for_status()
status = response.json()["state"]
if status in ["DONE GATHERING RESULTS", "CANCELLED"]:
return status
time.sleep(3)
return "TIMEOUT"

def _check_results(self, job_id):
response = self.session.get(f"{self.base_url}/search/jobs/{job_id}/messages")
response.raise_for_status()
return len(response.json()["messages"]) > 0
41 changes: 41 additions & 0 deletions scripts/validate_queries.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/usr/bin/env python3
import re
import sys
from pathlib import Path
from sumologic_client import SumoLogicClient

def find_sql_blocks_in_pr():
"""Detect changed SQL blocks without file modifications"""
changed_files = sys.argv[1:] if len(sys.argv) > 1 else [
str(p) for p in Path("docs").rglob("*.md")
if "search-query-language" in str(p)
]

sql_blocks = []
for file in changed_files:
content = Path(file).read_text()
sql_blocks.extend([
(file, sql.strip())
for sql in re.findall(r'```sql\n(.*?)```', content, re.DOTALL)
])
return sql_blocks

def validate_queries():
client = SumoLogicClient()
failed = False

for file, query in find_sql_blocks_in_pr():
print(f"Validating SQL in {file}...")
try:
if not client.test_query(query):
print(f"::error file={file},title=Query Validation Failed::Query returned no results")
failed = True
except Exception as e:
print(f"::error file={file},title=Query Execution Failed::{str(e)}")
failed = True

if failed:
sys.exit(1)

if __name__ == "__main__":
validate_queries()