---
updatedAt: 2026-10-14T21:17:34.000Z
agentTools:
  projectIndex: https://docs.observeinc.com/llms.txt
---

# Customize dashboard parameters

Learn how you can add more complex filters to your dashboard cards.

When you [Add dashboard parameters](https://docs.observeinc.com/docs/add-dashboard-parameters) in Observe by Snowflake, the bindings have the following properties by default:

* They apply only to a single field or tag.
* They filter that field or tag to be **equal** to the selected value(s).

For example:

<OpalCodeBlock code={
`// single-value example
filter clusterName = $Cluster_Name or is_null($Cluster_Name)

// multi-value example
filter array_contains($k8s_cluster-name, #k8s.cluster.name) or is_null($k8s_cluster_name)
`}/>

You can apply more complex filters to your dashboard cards. For example:

* **Dynamically adjusting a chart query.** You can adjust the **resolution** of a time chart while viewing a dashboard by directly injecting a parameter into the `timechart` OPAL verb.
* **Filtering using a non-equality.** You can apply **range** filters to your dashboard cards, such as a parameter that filters to duration greater than (**>**) some input, or a **contains** filter, such as a parameter that filters to all service names that contain **batchjob**. To do either of these cases, you must manually edit the default parameter OPAL binding to use a different filter operator.

Observe the following tips for creating custom parameter binding expressions:

* Make sure your parameter input matches the type of field you want to filter. Most parameters apply values of type `string` (with the exception of number parameters, which are type `float64`). So if you want to create a single-value that filters durations above a threshold, make sure to convert your parameter from a `string` to a `duration` using `parse_duration()`.
* Once you create a custom parameter binding expression, you’ll be locked into OPAL mode and will no longer be able to bind parameters to that modified card using the UI.

# **Example: Dynamically adjust the&#x20;**`timechart`**&#x20;resolution**

Create a single-value parameter and define a set of custom values that represent different time buckets. For example:

<Image src="https://files.readme.io/ab1a5882f58c3beaa177dc572278423070d16e88c6bd676efd63cfc4615770c8-Screenshot_2026-09-01_at_12.30.05_PM.png" align="center" width="450em" border={true} />

Replace the resolution in your time chart with `$test_span`, and convert that parameter (string) to type duration using `parse_duration` :&#x20;

<OpalCodeBlock code={
`timechart options(empty_bins:true), parse_duration($test_span), A_WebAppUserEventsv2_count:count(), group_by(clusterName)
`}/>

# **Example: Filter duration greater than some threshold**

Create a number parameter and bind it to your selected card.

<Image src="https://files.readme.io/2b3ff8831b5c0415f308f4493de1429d624ecd504ab4d21c5a1248bc4c6fdcb7-Screenshot_2026-09-01_at_12.35.35_PM.png" align="center" width="450em" border={true} />

Then alter that binding expression to use greater than (**>**) instead of equals (**=**), and convert the parameter from float64 to a duration.

<OpalCodeBlock code={
`filter duration > duration_ms($Minimum_duration_ms) or is_null($Minimum_duration_ms)
`}/>

# **Example: Filter service name based on partial match**

Create a text parameter and bind it to your selected card.

<Image src="https://files.readme.io/9be7ec2942c4cb5b6673b48be072c3b83f22e451968f20f2df597717c75069e2-Screenshot_2026-09-01_at_12.41.43_PM.png" align="center" width="450em" border={true} />

Then alter that binding expression to use `contains()` instead of `=`. You don't need to convert the parameter type because `contains()` already accepts strings.

<OpalCodeBlock code={
`filter contains(clusterName,$Test_contains) or $Test_contains = ""
`}/>

# Example: Create custom dashboard parameters using card queries

In this example, we'll use Kubernetes Logs data to create a dashboard with four total cards:

* Three of the cards are used as dashboard parameters.
* The fourth card contains data that can be filtered using the parameters from the first three cards. We will create single-value dashboard parameters using the first three cards to sort by cluster, namespace, and container names.

Begin by creating a new dashboard:

1. From the left nevigation, select **Dashboards**.
2. Click **New dashboard**.
3. Select **Add cards**.
4. Under the Tables section, select **Dataset**.
5. Find and select the **Kubernetes Logs** Dataset.
6. Give this query a name, such as **return cluster names**.
7. Click the code icon (<i class="fa-regular fa-code"></i>)**&#x20;** to open the OPAL editor, enter the following OPAL, then click **Apply**:

<OpalCodeBlock code={
`statsby group_by(cluster)
`}/> 

4. Repeat this procedure to add a second card to return namespace names:

<OpalCodeBlock code={
`statsby group_by(namespace)
`}/> 

5. Add a third card to return container names.

<OpalCodeBlock code={
`statsby group_by(container)
`}/> 

6. The fourth card contains the data we want to sort. We'll pick a series of columns from the Kubernetes Log:

<OpalCodeBlock code={
`pick_col timestamp, stream, cluster, namespace, container, pod, body
`}/> 

At this point, we have a dashbard with four cards:

<Image src="https://files.readme.io/69b7f2d961fffc9d55e2026c22804a242f0417fc6b5aa937b6e5a3b824997681-Screenshot_2026-10-14_at_11.06.14_AM.png" border={true} />

Next, we want to hide the cards we're using as filters. In the first three cards, hover on the card, click the ellipsis icon (<i class="fa-regular fa-ellipsis"></i>) and select **Hide card**.

<Image src="https://files.readme.io/09b0070dac949ebd4465eb9ed241718637a02ed3ecc63dd2f587a85d1d1f0aa0-Screenshot_2026-10-14_at_11.10.18_AM.png" border={true} />

After hiding the **return cluster names**, **return namespace names**, and **return container names** cards in our example, we are left with just one visible card:

<Image src="https://files.readme.io/9be66a99af2cbc4679ac569d3a1f39658a177883a8aa5a5b5116540c8e1bc463-Screenshot_2026-10-14_at_11.13.48_AM.png" border={true} />

Now, lets create the dashboard parameters.

1. Click **Add parameter**.
2. Select **Single-value**.
   1. Enter **Cluster** as the display name.
   2. Under **Populate menu using**, select **Card**.
   3. Select **return cluster names** as the card.
   4. Select **cluster** as the column.
   5. Click **Save & select cards**.
   6. Select all of the cards in the dashboard except for **return cluster names**, we don't want to apply the filter to the source card. We are going to bind the value to the **#k8s.cluster.name** correlation tag.
   7. Click **Save**.

<Image src="https://files.readme.io/ce38e545500946dfd4370ac69a1a9d7fcc58fa84c487cfff9654baa1ffbcd10f-Screenshot_2026-10-14_at_11.33.11_AM.png" border={true} />

3. Repeat this process to create a single-value card parameter for the namespace and container cards.
   * Create a filter called **Namespace** and apply it to the **#k8s.namespace.name** correlation tag in the other three cards, but not the **return namespace name** source card.
   * Create a filter called **Container** and apply it to the **#k8s.container.name** correlation tag in the other three cards, but not the **return container name** source card.
4. Give the dashbard a name, then click **Save**.

Here is the dashboard with the three single-value parameters:

<Image src="https://files.readme.io/0fa15e400bd6d59a0ac0725b656e57b1920e12f15f56f4ec255479686b43767a-Screenshot_2026-10-14_at_11.47.49_AM.png" border={true} />

To test the dashboard filters, let's begin by selecting a cluster: **k8s.observeinc.com**. The Kubernetes Log Data card shows data only from the selected cluster:

<Image src="https://files.readme.io/577f1a078e5fbf8caa6d5cd20b757c284b0df3acc75db40a51898f8f21d7440b-Screenshot_2026-10-14_at_12.09.36_PM.png" border={true} />

If we select another parameter, such as the **observe** namespace, the table onlys contain entries from the **k8s.observeinc.com** cluster and the **observe** namespace:

![](https://files.readme.io/0819e42bf90ff3936e6c38b1ad7c12cd152f89e98f47364214274b4a77a7abe0-Screenshot_2026-10-14_at_12.14.59_PM.png)

<br />

<br />