You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
345 lines
17 KiB
345 lines
17 KiB
<form script="estimated_billing.js" version="1.1">
|
|
<label>Current Month Estimated Billing - AWS</label>
|
|
|
|
<fieldset submitButton="false">
|
|
<input type="multiselect" token="billingAccountId" id="input1_all" searchWhenChanged="true">
|
|
<label>Account ID</label>
|
|
<choice value="*">All</choice>
|
|
<default>*</default>
|
|
<fieldForValue>LinkedAccountId</fieldForValue>
|
|
<fieldForLabel>Account</fieldForLabel>
|
|
<search id="billingAccountIdSearch">
|
|
<query>
|
|
<![CDATA[
|
|
`aws-cloudwatch-billing("*", "*")`
|
|
| stats count by LinkedAccountId
|
|
| `aws-accountid-to-name`
|
|
]]>
|
|
</query>
|
|
<earliest>-mon</earliest>
|
|
<latest>now</latest>
|
|
</search>
|
|
<prefix> (</prefix>
|
|
<suffix>) </suffix>
|
|
<valuePrefix>LinkedAccountId="</valuePrefix>
|
|
<valueSuffix>"</valueSuffix>
|
|
<delimiter> OR </delimiter>
|
|
</input>
|
|
<input type="dropdown" token="currency" searchWhenChanged="true">
|
|
<label>Currency</label>
|
|
<selectFirstChoice>true</selectFirstChoice>
|
|
<fieldForValue>Currency</fieldForValue>
|
|
<fieldForLabel>Currency</fieldForLabel>
|
|
<search>
|
|
<query>
|
|
<![CDATA[
|
|
`aws-cloudwatch-billing($billingAccountId$, "*")`
|
|
| `aws-cloudwatch-dimension-rex("Currency", "Currency")`
|
|
| dedup Currency
|
|
| eval CurrencyCode1=if(Currency=="USD", "AAA", Currency ) | sort CurrencyCode1 | table Currency
|
|
]]>
|
|
</query>
|
|
<earliest>-mon</earliest>
|
|
<latest>now</latest>
|
|
</search>
|
|
</input>
|
|
</fieldset>
|
|
|
|
<search id="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
`aws-cloudwatch-billing($billingAccountId$, $currency$)`
|
|
| stats sum(Sum) as sum by _time LinkedAccountId metric_dimensions
|
|
| `aws-cloudwatch-dimension-rex("ServiceName", "Service")`
|
|
| eval day=strftime(_time, "%Y/%m/%d")
|
|
| dedup day LinkedAccountId Service sortby -_time
|
|
| `aws-accountid-to-name`
|
|
]]>
|
|
</query>
|
|
<earliest>@mon</earliest>
|
|
<latest>now</latest>
|
|
</search>
|
|
|
|
<search id="baseCurrentSearch" base="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
dedup LinkedAccountId metric_dimensions
|
|
]]>
|
|
</query>
|
|
</search>
|
|
|
|
<row>
|
|
<panel>
|
|
<single>
|
|
<title>Estimated Cost - Month to Date</title>
|
|
<search base="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
timechart span=1d sum(sum) by LinkedAccountId
|
|
| addtotals
|
|
| search Total!=""
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="field">Total</option>
|
|
<option name="underLabel">$currency|currency2Symbol$</option>
|
|
</single>
|
|
</panel>
|
|
<panel>
|
|
<single>
|
|
<title>Total Projected Cost - This Month</title>
|
|
<search base="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
timechart span=1d sum(sum) as sum
|
|
| search sum=*
|
|
| predict sum future_timespan=31
|
|
| eval nowstring=strftime(now(), "%Y-%m")
|
|
| eval yearmonth=strftime(_time,"%Y-%m")
|
|
| where yearmonth=nowstring
|
|
| sort 1 -_time
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="field">prediction(sum)</option>
|
|
<option name="underLabel">$currency|currency2Symbol$</option>
|
|
</single>
|
|
</panel>
|
|
</row>
|
|
|
|
<row>
|
|
<panel>
|
|
<chart>
|
|
<title>Estimated Cost by Account</title>
|
|
<search base="baseCurrentSearch">
|
|
<query>
|
|
<![CDATA[
|
|
stats sum(sum) as Cost by Account
|
|
| table Account Cost
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="charting.chart">pie</option>
|
|
<option name="charting.drilldown">all</option>
|
|
</chart>
|
|
</panel>
|
|
<panel>
|
|
<chart>
|
|
<title>Estimated Cost by Service</title>
|
|
<search base="baseCurrentSearch">
|
|
<query>
|
|
<![CDATA[
|
|
stats sum(sum) as Cost by Service
|
|
| where Cost > 0
|
|
| table Service Cost
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="charting.chart">pie</option>
|
|
<option name="charting.drilldown">all</option>
|
|
</chart>
|
|
</panel>
|
|
</row>
|
|
|
|
<row>
|
|
<panel>
|
|
<chart>
|
|
<title>Month over Month Comparison - Daily Cost</title>
|
|
<search>
|
|
<query>
|
|
<![CDATA[
|
|
`aws-cloudwatch-billing($billingAccountId$, $currency$)`
|
|
| stats sum(Sum) as sum by _time LinkedAccountId
|
|
| eval day=strftime(_time, "%Y/%m/%d")
|
|
| dedup day LinkedAccountId sortby -_time
|
|
| timechart span=1d sum(sum) as "This Month"
|
|
| appendcols [ search earliest=-mon@mon latest=-mon `aws-cloudwatch-billing($billingAccountId$, $currency$)`
|
|
| stats sum(Sum) as sum by _time LinkedAccountId
|
|
| eval day=strftime(_time, "%Y/%m/%d")
|
|
| dedup day LinkedAccountId sortby -_time
|
|
| timechart span=1d sum(sum) as "Last Month"]
|
|
| fields _time "Last Month" "This Month"
|
|
]]>
|
|
</query>
|
|
<earliest>@mon</earliest>
|
|
<latest>now</latest>
|
|
</search>
|
|
<option name="charting.chart">column</option>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.overflowMode">ellipsisNone</option>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.rotation">0</option>
|
|
<option name="charting.axisTitleX.visibility">collapsed</option>
|
|
<option name="charting.axisTitleY.visibility">visible</option>
|
|
<option name="charting.axisTitleY2.visibility">visible</option>
|
|
<option name="charting.axisX.scale">linear</option>
|
|
<option name="charting.axisY.scale">linear</option>
|
|
<option name="charting.axisY2.enabled">0</option>
|
|
<option name="charting.axisY2.scale">inherit</option>
|
|
<option name="charting.chart.bubbleMaximumSize">50</option>
|
|
<option name="charting.chart.bubbleMinimumSize">10</option>
|
|
<option name="charting.chart.bubbleSizeBy">area</option>
|
|
<option name="charting.chart.nullValueMode">gaps</option>
|
|
<option name="charting.chart.showDataLabels">none</option>
|
|
<option name="charting.chart.sliceCollapsingThreshold">0.01</option>
|
|
<option name="charting.chart.stackMode">default</option>
|
|
<option name="charting.chart.style">shiny</option>
|
|
<option name="charting.drilldown">all</option>
|
|
<option name="charting.layout.splitSeries">0</option>
|
|
<option name="charting.layout.splitSeries.allowIndependentYRanges">0</option>
|
|
<option name="charting.legend.labelStyle.overflowMode">ellipsisMiddle</option>
|
|
<option name="charting.legend.placement">bottom</option>
|
|
</chart>
|
|
</panel>
|
|
<panel>
|
|
<chart>
|
|
<title>Cost Projection Over Time</title>
|
|
<search base="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
timechart span=1d sum(sum) as sum
|
|
| search sum=*
|
|
| predict sum as "Cost Projection" future_timespan=31
|
|
| rename sum as "Estimated Cost"
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.overflowMode">ellipsisNone</option>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.rotation">0</option>
|
|
<option name="charting.axisTitleX.visibility">collapsed</option>
|
|
<option name="charting.axisTitleY.visibility">visible</option>
|
|
<option name="charting.axisTitleY.text">Cost</option>
|
|
<option name="charting.axisTitleY2.visibility">visible</option>
|
|
<option name="charting.axisX.scale">linear</option>
|
|
<option name="charting.axisY.scale">linear</option>
|
|
<option name="charting.axisY2.enabled">false</option>
|
|
<option name="charting.axisY2.scale">inherit</option>
|
|
<option name="charting.chart">line</option>
|
|
<option name="charting.chart.bubbleMaximumSize">50</option>
|
|
<option name="charting.chart.bubbleMinimumSize">10</option>
|
|
<option name="charting.chart.bubbleSizeBy">area</option>
|
|
<option name="charting.chart.nullValueMode">connect</option>
|
|
<option name="charting.chart.sliceCollapsingThreshold">0.01</option>
|
|
<option name="charting.chart.stackMode">stacked</option>
|
|
<option name="charting.chart.style">shiny</option>
|
|
<option name="charting.drilldown">all</option>
|
|
<option name="charting.layout.splitSeries">0</option>
|
|
<option name="charting.legend.labelStyle.overflowMode">ellipsisMiddle</option>
|
|
<option name="charting.legend.placement">bottom</option>
|
|
<option name="wrap">true</option>
|
|
<option name="dataOverlayMode">none</option>
|
|
</chart>
|
|
</panel>
|
|
<panel>
|
|
<table>
|
|
<title>Estimated Cost by Account and Service - Month to Date</title>
|
|
<search base="baseCurrentSearch">
|
|
<query>
|
|
<![CDATA[
|
|
table LinkedAccountId, Service, sum, Account
|
|
| sort - sum
|
|
| where sum != 0
|
|
| eventstats sum(sum) as total
|
|
| eval Percentage=tostring(round(100*sum/total, 2))+"%"
|
|
| rename sum as "Cost"
|
|
| fieldformat Cost="$currency|currency2Symbol$".round(Cost, 0)
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<fields>Account Service Cost Percentage</fields>
|
|
<option name="wrap">true</option>
|
|
<option name="drilldown">row</option>
|
|
<option name="dataOverlayMode">none</option>
|
|
<option name="count">10</option>
|
|
<option name="cell.percentage">Percentage</option>
|
|
<drilldown>
|
|
<set token="detailed.accountId">$row.LinkedAccountId$</set>
|
|
<set token="detailed.accountLabel">$row.Account$</set>
|
|
<set token="detailed.service">$row.Service$</set>
|
|
</drilldown>
|
|
</table>
|
|
</panel>
|
|
</row>
|
|
|
|
<row>
|
|
<panel>
|
|
<chart depends="$detailed.accountId$">
|
|
<title>Cost Projection Over Time for $detailed.service$ in Account $detailed.accountLabel$</title>
|
|
<search base="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
search LinkedAccountId="$detailed.accountId$" metric_dimensions="*$detailed.service$*"
|
|
| timechart span=1d sum(sum) as sum
|
|
| search sum=*
|
|
| predict sum as "Cost Projection" future_timespan=31
|
|
| rename sum as "Estimated Cost"
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.overflowMode">ellipsisNone</option>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.rotation">0</option>
|
|
<option name="charting.axisTitleX.visibility">collapsed</option>
|
|
<option name="charting.axisTitleY.visibility">visible</option>
|
|
<option name="charting.axisTitleY.text">Cost</option>
|
|
<option name="charting.axisTitleY2.visibility">visible</option>
|
|
<option name="charting.axisX.scale">linear</option>
|
|
<option name="charting.axisY.scale">linear</option>
|
|
<option name="charting.axisY2.enabled">false</option>
|
|
<option name="charting.axisY2.scale">inherit</option>
|
|
<option name="charting.chart">line</option>
|
|
<option name="charting.chart.bubbleMaximumSize">50</option>
|
|
<option name="charting.chart.bubbleMinimumSize">10</option>
|
|
<option name="charting.chart.bubbleSizeBy">area</option>
|
|
<option name="charting.chart.nullValueMode">connect</option>
|
|
<option name="charting.chart.sliceCollapsingThreshold">0.01</option>
|
|
<option name="charting.chart.stackMode">stacked</option>
|
|
<option name="charting.chart.style">shiny</option>
|
|
<option name="charting.drilldown">all</option>
|
|
<option name="charting.layout.splitSeries">0</option>
|
|
<option name="charting.legend.labelStyle.overflowMode">ellipsisMiddle</option>
|
|
<option name="charting.legend.placement">right</option>
|
|
<option name="wrap">true</option>
|
|
<option name="dataOverlayMode">none</option>
|
|
</chart>
|
|
</panel>
|
|
<panel>
|
|
<chart depends="$detailed.accountId$">
|
|
<title>Daily Cost for $detailed.service$ in Account $detailed.accountLabel$</title>
|
|
<search base="baseBillingSearch">
|
|
<query>
|
|
<![CDATA[
|
|
search LinkedAccountId="$detailed.accountId$" metric_dimensions="*$detailed.service$*"
|
|
| timechart span=1d sum(sum) as sum
|
|
| delta sum as Cost
|
|
| eval Cost=if(Cost!="*", Cost, sum)
|
|
| fields - sum
|
|
]]>
|
|
</query>
|
|
</search>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.overflowMode">ellipsisNone</option>
|
|
<option name="charting.axisLabelsX.majorLabelStyle.rotation">0</option>
|
|
<option name="charting.axisTitleX.visibility">collapsed</option>
|
|
<option name="charting.axisTitleY.visibility">visible</option>
|
|
<option name="charting.axisTitleY.text">Daily Cost</option>
|
|
<option name="charting.axisTitleY2.visibility">visible</option>
|
|
<option name="charting.axisX.scale">linear</option>
|
|
<option name="charting.axisY.scale">linear</option>
|
|
<option name="charting.axisY2.enabled">false</option>
|
|
<option name="charting.axisY2.scale">inherit</option>
|
|
<option name="charting.chart">column</option>
|
|
<option name="charting.chart.bubbleMaximumSize">50</option>
|
|
<option name="charting.chart.bubbleMinimumSize">10</option>
|
|
<option name="charting.chart.bubbleSizeBy">area</option>
|
|
<option name="charting.chart.nullValueMode">connect</option>
|
|
<option name="charting.chart.sliceCollapsingThreshold">0.01</option>
|
|
<option name="charting.chart.stackMode">stacked</option>
|
|
<option name="charting.chart.style">shiny</option>
|
|
<option name="charting.drilldown">all</option>
|
|
<option name="charting.layout.splitSeries">0</option>
|
|
<option name="charting.legend.labelStyle.overflowMode">ellipsisMiddle</option>
|
|
<option name="charting.legend.placement">right</option>
|
|
<option name="wrap">true</option>
|
|
<option name="dataOverlayMode">none</option>
|
|
</chart>
|
|
</panel>
|
|
</row>
|
|
</form>
|