card
A card is used to show a value to the user, or some change in value. A card can also present itself in different types. You can even dynamically style the card. For example, you may show the count of public S3 buckets and if the value is greater than 0, display an alert
type card, otherwise show an ok
type card.
Cards can be declared as named resources at the top level of a mod, or they can be declared as anonymous blocks inside a dashboard
or container
, or be re-used inside a dashboard
or container
by using a card
with base = <mod>.card.<card_resource_name>
.
Example Usage
card {sql = <<-EOQselectcount(*) as "Buckets"fromaws_s3_bucketEOQicon = "hashtag"width = 2}
Argument Reference
Argument | Type | Optional? | Description |
---|---|---|---|
args | Map | Optional | A map of arguments to pass to the query. |
base | Card Reference | Optional | A reference to a named card resource that this card should source its definition from. label , title , value , type and width can be overridden after sourcing via base . |
database | String | Optional | A database connection string for the database you wish to query. If not specified, the active database will be used. |
icon | String | Optional | An icon to use for the elements with this category. |
href | String | Optional | A url that the card should link to. The href may use a jq template to dynamically generate the link the card. |
label | String | Optional | Inferred from the first column name in simple data format. Else can be set explicitly in HCL, or returned by the query in the label column in the formal data format. |
param | Block | Optional | A param block that defines the parameters that can be passed in to the query. param blocks may only be specified for cards that specify the sql argument. |
query | Query Reference | Optional | A reference to a query resource that defines the query to run. A card may either specify the query argument or the sql argument, but not both. |
--search-path | String | Optional | Set a comma-separated list of connections to use as a custom search path for the query |
--search-path-prefix | String | Optional | Set a comma-separated list of connections to use as a prefix to the current search path for the query. |
sql | String | Optional | An SQL string to provide data for the card. A card may either specify the query argument or the sql argument, but not both. |
title | String | Optional | A plain text title to display for this card. |
type | String | Optional | plain (default), alert , info or ok . You can also use table to review the raw data. |
value | String | Optional | Inferred from the first column's value in simple data format. |
width | Number | Optional | The width as a number of grid units that this item should consume from its parent. |
Data Structure
A card supports 2 data structures.
- A simple structure where column 1's name is the card
label
and column 1's value is the cardvalue
. - A formal data structure where the column names map to the properties of the
card
.
Simple data structure:
<label> |
---|
<value> |
For example:
Unencrypted Buckets |
---|
25 |
Formal data structure:
label | value | type |
---|---|---|
Unencrypted Buckets | 10 | alert |
JQ Templates
The href
argument allows you to specify a jq template to dynamically generate a hyperlink from the data in the row. To use a jq template, enclose the jq in double curly braces ({{ }}
).
Powerpipe will pass the first row of data to jq in the same format that is returned by powerpipe query JSON mode output, where the keys are the column names and the values are the data for that row.
For example, this query:
selects.volume_id as value,'Source Volume' as label,'info' as type,v.arnfromaws_ebs_snapshot as s,aws_ebs_volume as vwheres.volume_id = v.volume_idand s.snapshot_id = 'snap-0cc613495a9fe5c1c';
will present rows to the jq template in this format:
{"arn": "arn:aws:ec2:us-east-2:123456789012:volume/vol-0566e02dcc2c08e77","label": "Source Volume","type": "info","value": "vol-0566e02dcc2c08e77"}
which you can then use in a jq template in the href
argument:
card {sql = <<-EOQselects.volume_id as value,'Source Volume' as label,'info' as type,v.arnfromaws_ebs_snapshot as s,aws_ebs_volume as vwheres.volume_id = v.volume_idand s.snapshot_id = 'snap-0cc613495a9fe5c1c';EOQwidth = 3href = "/aws_insights.dashboard.aws_ebs_volume_detail?input.volume_arn={{.arn | @uri}}"}
Note that for a card
, we pass label
, value
, type
or icon
HCL attributes in the JQ context, but the columns from the SQL query will overwrite any of the statically-defined HCL attributes.
Refer to JQ Escaping & Interpolation for more advanced examples.
More Examples
Alert Card
card {sql = "select 0 as alert"type = "alert"width = 2}
OK Card
card {sql = "select 0 as ok"type = "ok"width = 2}
Info Card
card {sql = "select 0 as info"type = "info"width = 2}
Dynamic Styling via formal query data structure
card {sql = <<-EOQselect'Unencrypted Buckets' as label,count(*) as value,casewhen count(*) > 0 then 'alert'else 'ok'end as typefromaws_s3_bucketwhereserver_side_encryption_configuration is null;EOQwidth = 2}
Static data and static (external) link
card {value = "github"label = "site"width = 2href = "https://github.com"}
Dynamic data and static (internal) link
card {sql = <<-EOQselectcount(*) as value,'Has Public Bucket Policy' as label,casecount(*)when 0 then 'ok'else 'alert'end as "type"fromaws_s3_bucketwherebucket_policy_is_public;EOQicon = "hashtag"width = 2href = "${dashboard.aws_s3_bucket_public_access_report.url_path}"}
Dynamic link with JQ template
card {sql = <<-EOQselects.volume_id as value,'Source Volume' as label,'info' as type,v.arnfromaws_ebs_snapshot as s,aws_ebs_volume as vwheres.volume_id = v.volume_idand s.snapshot_id = 'snap-0cc613495a9fe5c1c';EOQwidth = 3href = "/aws_insights.dashboard.aws_ebs_volume_detail?input.volume_arn={{.arn | @uri}}"}