Skip to content

Commit

Permalink
Merge pull request #756 from Thorium/dashboard-fixes
Browse files Browse the repository at this point in the history
Dashboads: Fixes for complex dashboards: custom parts and monitor parts.
  • Loading branch information
ninjarobot authored Aug 24, 2021
2 parents 8854662 + b1d6a3a commit d2a739c
Show file tree
Hide file tree
Showing 5 changed files with 278 additions and 133 deletions.
2 changes: 2 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
Release Notes
=============
#vNext
* Dashboads: Fixes for complex dashboards: custom parts and monitor parts.

## 1.6.13
* Alerts: Initial support for Alerts
Expand Down
47 changes: 0 additions & 47 deletions docs/content/api-overview/resources/dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,50 +62,3 @@ let dash = dashboard {
}
```

You can also create more complex custom dashboards:

```fsharp
let chartTitle = "my DB monitor"
let valueToMonitor = "dtu_consumption_percent", "DTU percentage"
let databaseResourceId = "test"
let lineColor = "#47BDF5"
let dashboard2 = dashboard {
name "myDashboard"
title "DB-Monitoring"
add_monitor_chart({| x = 0; y = 0; rowSpan = 6; colSpan = 10 |},
({| chartSettings = {| title = chartTitle
openBladeOnClick = {| openBlade = true |}
visualization = {| chartType = 2; legendVisualization = null; disablePinning = true;
axisVisualization = {| y = {| isVisible = true |} |} |}
metrics = [ {| resourceMetadata = {| id = databaseResourceId |}
name = fst valueToMonitor
aggregationType = 3
metricVisualization = {| displayName = snd valueToMonitor;
color = lineColor; resourceDisplayName = null |} |} ] |} :> obj |> Some
chartInputs = [ {| title = chartTitle
ariaLabel = null; filterCollection = null; grouping = null;
visualization = {| axisVisualization = null; legendVisualization = null; chartType = null|}
resolvedBladeToOpenOnClick = {| openBlade = true |}
timespan = {| relative = {| duration = 3600000 |} |}
timeContext = {| options = {| useDashboardTimeRange = false; grain = 1 |}
relative = {| duration = 3600000 |} |}
metrics = [ {| resourceMetadata = {| id = databaseResourceId; kind = "v12.0,user" |}
name = fst valueToMonitor; metricVisualization = null;
aggregationType = 3; thresholds = []
|} ]
itemDataModel = {| id = $"defaultAiChartDiv{System.Guid.NewGuid()}"; grouping = null; chartHeight = 1;
priorPeriod = false; horizontalBars = true; showOther = false; palette = "multiColor";
jsonDefinitionId = ""; yAxisOptions = {| options = 1 |};
appliedISOGrain = (System.TimeSpan(0,1,0) |> IsoDateTime.OfTimeSpan);
title = chartTitle; titleKind = "Auto"
visualization = {| chartType = 2; legend = null; axis = null |}
metrics = [
{| id = {| resourceDefinition = {| id = databaseResourceId; name = null |}
name = {| id = fst valueToMonitor; displayName = snd valueToMonitor |} |}
metricAggregation = 3; color = lineColor; unit = 5; useSIConversions = false; displaySIUnit = true
|} ]
|} |} ]
filters = {| MsPortalFx_TimeRange = {| model = {| format = "local"; granularity = "auto"; relative = "60m" |} |} |} :> obj |> Some
|}))
}
```
66 changes: 33 additions & 33 deletions src/Farmer/Arm/Dashboard.fs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ type LensMetadata = {
``type`` : string
inputs : obj list
settings : obj
filters : obj option
asset : LensAsset option
isAdapter : bool option
defaultMenuItemId : string option
filters : obj
asset : LensAsset
isAdapter : System.Nullable<bool>
defaultMenuItemId : string
}
type LensPosition = { x : int; y : int; rowSpan : int; colSpan : int; }

Expand All @@ -34,10 +34,10 @@ let generateMarkdownPart (markdownProperties:MarkdownPartParameters) = {
``type`` = "Extension[azure]/HubsExtension/PartType/MarkdownPart"
inputs = List.empty
settings = {| content = markdownProperties.content; title = markdownProperties.title; subtitle = markdownProperties.subtitle |} :> obj
filters = None
asset = None
isAdapter = None
defaultMenuItemId = None
filters = null
asset = Unchecked.defaultof<LensAsset>
isAdapter = System.Nullable()
defaultMenuItemId = null
}

type VideoPartParameters = {title:string; subtitle:string; url:string}
Expand All @@ -46,32 +46,32 @@ let generateVideoPart (videoProperties:VideoPartParameters) = {
``type`` = "Extension[azure]/HubsExtension/PartType/VideoPart"
inputs = List.empty
settings = {| content = {| settings = {| title = videoProperties.title; subtitle = videoProperties.subtitle; src = videoProperties.url; autoplay= false |} |} |} :> obj
filters = None
asset = None
isAdapter = None
defaultMenuItemId = None
filters = null
asset = Unchecked.defaultof<LensAsset>
isAdapter = System.Nullable()
defaultMenuItemId = null
}

/// Generates a virtualMachinePart
let generateVirtualMachinePart (vmId:ResourceId) = {
``type`` = "Extension/Microsoft_Azure_Compute/PartType/VirtualMachinePart"
inputs = [ {| name = "id"; value = vmId.ArmExpression.Eval() |} :> obj ]
settings = None
filters = None
asset = Some { idInputName = "id"; ``type`` = "VirtualMachine" }
isAdapter = None
defaultMenuItemId = Some "overview"
settings = null
filters = null
asset = { idInputName = "id"; ``type`` = "VirtualMachine" }
isAdapter = System.Nullable()
defaultMenuItemId = "overview"
}

/// Generates a virtualMachinePart
/// Generates a webtest part
let generateWebtestResultPart (applicationInsightsName:string) = {
``type`` = "Extension/AppInsightsExtension/PartType/AllWebTestsResponseTimeFullGalleryAdapterPart"
inputs = [ {| name = "ComponentId"; value = {| Name = applicationInsightsName; SubscriptionId = "[ subscription().subscriptionId ]"; ResourceGroup = "[ resourceGroup().id ]" |} |} ]
settings = None
filters = None
asset = Some { idInputName = "ComponentId"; ``type`` = "ApplicationInsights" }
isAdapter = Some true
defaultMenuItemId = None
settings = null
filters = null
asset = { idInputName = "ComponentId"; ``type`` = "ApplicationInsights" }
isAdapter = System.Nullable(true)
defaultMenuItemId = null
}
type MetrixChartParameters = { resourceId:ResourceId; metrics: MetricsName list; interval : IsoDateTime }
/// Generates a MetricsChartPart for a resource given in parameters
Expand All @@ -84,26 +84,26 @@ let generateMetricsChartPart (chartProperties:MetrixChartParameters) = {
metrics = chartProperties.metrics |> List.map(function
MetricsName m -> {| name = m; resourceId = chartProperties.resourceId.ArmExpression.Eval() |})
|} |} ]
settings = None
filters = None
asset = None
isAdapter = None
defaultMenuItemId = None
settings = null
filters = null
asset = Unchecked.defaultof<LensAsset>
isAdapter = System.Nullable()
defaultMenuItemId = null
}

type MonitorChartParameters = { chartInputs:obj list; chartSettings: obj option; filters : obj option }
type MonitorChartParameters = { chartInputs:obj list; chartSettings: obj; filters : obj }
/// Generates a MonitorChartPart
let generateMonitorChartPart (chartProperties : MonitorChartParameters) = {
``type`` = "Extension/HubsExtension/PartType/MonitorChartPart"
inputs = [ box <| {| name = "sharedTimeRange"; isOptional = true |};
box <| {| name = "options"
value = {| v2charts = true
charts = [ chartProperties.chartInputs ] |} |} ]
settings = Some ({| content = {| options = {| chart = chartProperties.chartSettings |} |} |})
settings = {| content = {| options = {| chart = chartProperties.chartSettings |} |} |}
filters = chartProperties.filters
asset = None
isAdapter = None
defaultMenuItemId = None
asset = Unchecked.defaultof<LensAsset>
isAdapter = System.Nullable()
defaultMenuItemId = null
}

type Dashboard =
Expand Down
6 changes: 3 additions & 3 deletions src/Farmer/Builders/Builders.Dashboard.fs
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ type DashboardBuilder() =
{ state with LensParts = ({ position = position; metadata = vmPart}) :: state.LensParts }

[<CustomOperation "add_webtest_results_part">]
/// Create webtest results part for the dashboard
member __.WebtestResultPart(state:DashboardConfig, (position, virtualMachineName)) =
let vmPart = generateWebtestResultPart virtualMachineName
/// Create webtest results part for the dashboard. Parameter: Application Insights name.
member __.WebtestResultPart(state:DashboardConfig, (position, applicationInsightsName)) =
let vmPart = generateWebtestResultPart applicationInsightsName
{ state with LensParts = ({ position = position; metadata = vmPart}) :: state.LensParts }

[<CustomOperation "add_metrics_chart">]
Expand Down
Loading

0 comments on commit d2a739c

Please sign in to comment.