google-agents-cli-scaffold
Project scaffolding, deployment configuration, and CI/CD setup for Google ADK agents.
filtering-event-datasets
Filter and search event datasets (logs) using OPAL. Use when you need to find specific log events by text search, regex patterns, or field values. Covers contains(), tilda operator ~, field comparisons, boolean logic, and limit for sampling results. Does NOT cover aggregation (see aggregating-eve...
Full skill instructions
Event datasets (logs) represent point-in-time occurrences with a single timestamp. This skill teaches you how to filter and search log data to find specific events using OPAL.
log interface (or any Event dataset)Event datasets represent discrete occurrences at specific points in time. Unlike Intervals (which have start/end times), Events are instantaneous observations.
Characteristics:
timestamp field (sometimes named time, eventTime, etc.)logMost log datasets follow this pattern:
body, message, or log - The actual log message texttimestamp, time, eventTime, etc - When the log occurredresource_attributes.* or labels - Nested metadata about the sourcecluster, namespace, pod, container, stream, levelFields with dots in their names MUST be quoted:
resource_attributes."k8s.namespace.name" ✓ Correct
resource_attributes.k8s.namespace.name ✗ Wrong
Always start by finding and exploring your log dataset.
Step 1: Search for log datasets
discover_context("logs kubernetes")
Look for datasets with interface type log or category "Logs".
Step 2: Get detailed schema
discover_context(dataset_id="YOUR_DATASET_ID")
Note the exact field names (case-sensitive!) and nested field structure. Pay attention to:
body, message, log, or similar field for main log contentresource_attributes.*, labels or other nested objects for dimensionsnamespace, pod, container, stream, levelUse case: Find logs containing specific text
filter contains(body, "error")
| limit 100
Explanation: Searches the body field for the substring "error" and returns the first 100 matching logs in their default order (typically reverse chronological, most recent first).
When to use: Quick text search to find recent examples of specific log messages.
Use case: Find logs matching a pattern regardless of case
filter body ~ /error/i
| limit 100
Explanation: Uses regex operator ~ with forward slashes /pattern/ for POSIX ERE pattern matching. The /i flag makes matching case-insensitive (matches "error", "ERROR", "Error", etc.). Without /i, matching is case-sensitive.
Regex syntax:
/pattern/ - Case-sensitive regex/pattern/i - Case-insensitive regex/\[ERROR\]/ to match literal "[ERROR]"Use case: Find logs matching a specific format (log levels, codes, structured fields)
filter body ~ /level=warn/i
| limit 100
Explanation: Matches logs containing "level=warn" (case-insensitive). Useful for structured logging formats with key=value pairs.
More examples:
# Match HTTP status codes
filter body ~ /status=[45][0-9]{2}/
# Match IP addresses
filter body ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
# Match specific log levels
filter body ~ /\[WARN\]|\[ERROR\]/ # Note: May have issues with MCP tool due to pipe
Use case: Filter by specific field values (not text search)
filter stream = "stderr"
| limit 100
Explanation: Filters logs written to stderr stream. Field comparisons use =, !=, >, <, >=, <= operators.
More examples:
# Filter by namespace (nested field)
filter string(resource_attributes."k8s.namespace.name") = "production"
| limit 100
# Filter by pod
filter pod = "api-gateway-abc123"
| limit 100
Use case: Combine multiple filters with boolean logic
filter (contains(body, "error") or contains(body, "exception"))
| filter string(resource_attributes."k8s.namespace.name") = "production"
| limit 100
Explanation: Chains multiple filters together. First filters for text content (error OR exception), then filters for specific namespace. Each filter verb can be chained with |.
Boolean operators:
and - Both conditions must be trueor - At least one condition must be truenot - Negates a conditionMore examples:
# Multiple fields
filter namespace = "production" and stream = "stderr"
| limit 100
# Negation
filter not contains(body, "debug")
| limit 100
# Complex conditions
filter (level = "error" or level = "warn") and namespace != "test"
| limit 100
End-to-end workflow for finding recent errors in production.
Scenario: You need to investigate errors in the production namespace from the last hour.
Step 1: Discovery
discover_context("kubernetes logs")
Found: Dataset "Kubernetes Explorer/Kubernetes Logs" (ID: 42161740) with interface log
Step 2: Get schema details
discover_context(dataset_id="42161740")
Key fields identified: body, namespace, pod, container, stream, resource_attributes.*
Step 3: Build query
filter (contains(body, "error") or contains(body, "ERROR"))
| filter string(resource_attributes."k8s.namespace.name") = "production"
| filter stream = "stderr"
| limit 100
Step 4: Execute
execute_opal_query(
query="[query above]",
primary_dataset_id="42161740",
time_range="1h"
)
Step 5: Interpret results
Returns up to 100 most recent logs (reverse chronological) that:
You can now examine these logs to identify the issue.
❌ Wrong:
filter resource_attributes.k8s.namespace.name = "production"
✅ Correct:
filter string(resource_attributes."k8s.namespace.name") = "production"
Why: Field names containing dots must be quoted. Also wrap in string() for type safety.
❌ Wrong:
filter body ~ "error[0-9]+" # This is string matching, not regex
✅ Correct:
filter body ~ /error[0-9]+/ # Forward slashes for regex
Why: Regex patterns must use forward slashes /pattern/. Double quotes are for string literals.
❌ Wrong:
filter contains(body, "Error") # Only finds "Error", not "error" or "ERROR"
✅ Correct:
# Option 1: Multiple conditions
filter contains(body, "error") or contains(body, "Error") or contains(body, "ERROR")
# Option 2: Case-insensitive regex
filter body ~ /error/i
Why: contains() is case-sensitive. Use regex with /i flag for case-insensitive matching.
❌ Wrong (for filtered raw events):
filter contains(body, "error")
| topk 100, max(timestamp) # topk is for aggregated results!
✅ Correct:
filter contains(body, "error")
| limit 100 # limit is for raw events
Why: limit returns the first N results in their current order (for raw events). topk is for aggregated results (see aggregating-event-datasets skill).
limit for sampling: Always add | limit N when exploring to avoid overwhelming resultsdiscover_context() to get exact field names (case-sensitive!)string(), int64(), etc. for type safetyCommon POSIX ERE patterns:
. - Any character* - Zero or more of previous+ - One or more of previous? - Zero or one of previous[abc] - Character class (a, b, or c)[0-9] - Digit[a-z] - Lowercase letter^ - Start of line$ - End of line\ - Escape special characterFlags:
/i - Case-insensitiveFor more details, see:
Last Updated: November 14, 2025 Version: 2.0 (Split from combined skill) Tested With: Observe OPAL v2.x
Project scaffolding, deployment configuration, and CI/CD setup for Google ADK agents.
Set up tracing, logging, and monitoring for deployed ADK agents across Cloud Trace, BigQuery, and third-party platforms.
Enterprise Azure infrastructure architect generating Bicep or Terraform from workload descriptions.
Plan and configure production-ready Azure Kubernetes Service clusters with Day-0 and Day-1 best practices.
Raw mechanical interfaces fusing Swiss typographic print with military terminal aesthetics. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects. For data-heavy dashboards, portfolios, or editorial sites that need to feel like declassified blueprints.
Web search, scraping, extraction, crawling, and monitoring via ScrapeGraph AI CLI.
Skill for working with Firebase Hosting (Classic). Use this when you want to deploy static web apps, Single Page Apps (SPAs), or simple microservices. Do NOT use for Firebase App Hosting.
Deploy and manage web apps with Firebase App Hosting. Use this skill when deploying Next.js/Angular apps with backends.
Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment".
Build SEO-optimized pages at scale using templates, data, and proven playbook patterns.
Design and build isolated, reusable Convex backend components with clear boundaries and app-facing wrappers.
Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".
Opus.ai: Revolutionize Your Web Experience
Build a no-code AI app in minutes.
An IDE for code migration from legacy to modern frameworks through coding agents.
Automate CGI animation in live-action scenes
Branded artistic QR-code concepts
Launch a website in seconds with AI.
Streamline Your Coding Experience with AI Code Helper
Convert any screenshot or design to clean code.