Functions/BloxOneDDI/Get-B1TopMetrics.ps1

function Get-B1TopMetrics {
    <#
    .SYNOPSIS
        Retrieves top metrics from BloxOneDDI

    .DESCRIPTION
        This function is used to retrieve top metrics from BloxOneDDI

    .PARAMETER TopQueries
        Use this parameter to select Top Queries as the top metric category

    .PARAMETER QueryType
        Use this parameter to specify the query type when using -TopQueries

    .PARAMETER TopClients
        Use this parameter to select Top Clients as the top metric category

    .PARAMETER TopClientLogType
        Use this parameter to specify the top client log type when using -TopClients

    .PARAMETER TopCount
        Use this parameter to return X results for the top metric selected

    .PARAMETER TopDNSServers
        Use this parameter to return a list of DNS Servers by query count

    .PARAMETER Granularity
        Use this parameter to return results based on intervals instead of aggregated across the whole time period

    .PARAMETER Start
        The start date/time for searching aggregated metrics

    .PARAMETER End
        The end date/time for searching aggregated metrics

    .EXAMPLE
        Get-B1TopMetrics -TopQueries DFP -TopCount 50 -Start (Get-Date).AddDays(-1)

    .EXAMPLE
        Get-B1TopMetrics -TopDNSServers -Start (Get-Date).AddDays(-31)
   
    .FUNCTIONALITY
        BloxOneDDI
    
    .FUNCTIONALITY
        Metrics
    #>

    [CmdletBinding(DefaultParameterSetName="default")]
    param (
        [switch][parameter(ParameterSetName="topQueries")] $TopQueries,
        [string][parameter(ParameterSetName="topQueries", Mandatory=$true)][ValidateSet("NXDOMAIN","NXRRSET","DNS","DFP")] $QueryType,
        [switch][parameter(ParameterSetName="topClients")] $TopClients,
        [string][parameter(ParameterSetName="topClients")][ValidateSet("DNS","DFP","DHCP")] $TopClientLogType,
        [switch][parameter(ParameterSetName="topDNSServers")] $TopDNSServers,
        [string][parameter(ParameterSetName="topDNSServers")][ValidateSet("minute","hour","day","week","month","year")] $Granularity,
        [int]$TopCount = "20",
        [datetime]$Start = (Get-Date).AddDays(-1),
        [datetime]$End = (Get-Date)
    )

    $Start = $Start.ToUniversalTime()
    $End = $End.ToUniversalTime()
    $StartDate = $Start.ToString("yyyy-MM-ddTHH:mm:ss.000")
    $EndDate = $End.ToString("yyyy-MM-ddTHH:mm:ss.000")

    if ($TopQueries) {
        switch ($QueryType) {
            "NXDOMAIN" {
                $splat = @{
                    "measures" = @(
                        "NstarDnsActivity.total_count"
                    )
                    "dimensions" = @(
                        "NstarDnsActivity.qname"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "NstarDnsActivity.timestamp"
                            "dateRange" = @(
                                $StartDate
                                $EndDate
                            )
                            "granularity" = $null
                        }
                    )
                    "filters" = @(
                        @{
                            "member" = "NstarDnsActivity.response"
                            "operator" = "equals"
                            "values" = @(
                                "NXDOMAIN"
                            )
                        }
                     )
                    "limit" = $TopCount
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"

                $DNSClients = $Result.result.data | Select-Object @{name="query";Expression={$_.'NstarDnsActivity.qname'}},`
                                             @{name="queryCount";Expression={$_.'NstarDnsActivity.total_count'}} | Sort-Object queryCount
                $DNSClients
                break
            }
            "NXRRSET" {
                $splat = @{
                    "measures" = @(
                        "NstarDnsActivity.total_count"
                    )
                    "dimensions" = @(
                        "NstarDnsActivity.qname"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "NstarDnsActivity.timestamp"
                            "dateRange" = @(
                                $StartDate
                                $EndDate
                            )
                            "granularity" = $null
                        }
                    )
                    "filters" = @(
                        @{
                            "member" = "NstarDnsActivity.response"
                            "operator" = "equals"
                            "values" = @(
                                "NXRRSET"
                            )
                        }
                     )
                    "limit" = $TopCount
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"

                $DNSClients = $Result.result.data | Select-Object @{name="query";Expression={$_.'NstarDnsActivity.qname'}},`
                                             @{name="queryCount";Expression={$_.'NstarDnsActivity.total_count'}} | Sort-Object queryCount
                $DNSClients
                break
            }
            "DNS" {
                $splat = @{
                    "measures" = @(
                        "NstarDnsActivity.total_count"
                    )
                    "dimensions" = @(
                        "NstarDnsActivity.qname"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "NstarDnsActivity.timestamp"
                            "dateRange" = @(
                                $StartDate
                                $EndDate
                            )
                            "granularity" = $null
                        }
                    )
                    "limit" = $TopCount
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"

                $DNSClients = $Result.result.data | Select-Object @{name="query";Expression={$_.'NstarDnsActivity.qname'}},`
                                             @{name="queryCount";Expression={$_.'NstarDnsActivity.total_count'}} | Sort-Object queryCount
                $DNSClients
                break
            }
            "DFP" {
                $splat = @{
                    "measures" = @(
                        "PortunusDnsLogs.qnameCount"
                    )
                    "dimensions" = @(
                        "PortunusDnsLogs.qname"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "PortunusDnsLogs.timestamp"
                            "dateRange" = @(
                                $StartDate
                                $EndDate
                            )
                        }
                    )
                    "filters" = @(
                        @{
                            "member" = "PortunusDnsLogs.type"
                            "operator" = "equals"
                            "values" = @(
                                "1"
                            )
                        }
                    )
                    "limit" = $TopCount
                    "ungrouped" = $false
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"
                $TopQueriesLog = $Result.result.data | Select-Object @{name="query";Expression={$_.'PortunusDnsLogs.qname'}},`
                                             @{name="queryCount";Expression={$_.'PortunusDnsLogs.qnameCount'}}
                $TopQueriesLog
                break
            }
            default {
                Write-Host "Error. Permitted QueryType options are: NXDOMAIN, NXRRSET, DFP" -ForegroundColor Red
                break
            }
        }
    }
    if ($TopClients) {
        switch ($TopClientLogType) {
            "DNS" {
                $DNSHosts = Get-B1DNSHost
                $splat = @{
                    "measures" = @(
                        "NstarDnsActivity.total_count"
                    )
                    "dimensions" = @(
                        "NstarDnsActivity.device_ip",
                        "NstarDnsActivity.site_id"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "NstarDnsActivity.timestamp"
                            "dateRange" = @(
                                $StartDate
                                $EndDate
                            )
                            "granularity" = $null
                        }
                    )
                    "filters" = @()
                    "limit" = $TopCount
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"

                $DNSClients = $Result.result.data | Select-Object @{name="device_ip";Expression={$_.'NstarDnsActivity.device_ip'}},`
                                             @{name="queryCount";Expression={$_.'NstarDnsActivity.total_count'}},`
                                             @{name="licenseUsage";Expression={[math]::Round(($_.'NstarDnsActivity.total_count')/6000 + 0.5)}},`
                                             @{Name = 'DNS-Server'; Expression = {$SiteID = $_.'NstarDnsActivity.site_id';if ($SiteID) {($DNSHosts | Where-Object {$_.site_id -eq $SiteID}).name}}},`
                                             @{name="site_id";Expression={$_.'NstarDnsActivity.site_id'}} | Sort-Object queryCount
                $DNSClients
                break
            }
            "DFP" {
                $splat = @{
                    "measures" = @(
                        "PortunusAggUserDevices.deviceCount"
                    )
                    "dimensions" = @(
                        "PortunusAggUserDevices.device_name"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "PortunusAggUserDevices.timestamp"
                            "dateRange" = @(
                                $StartDate,
                                $EndDate
                            )
                        }
                    )
                    "filters" = @(
                        @{
                            "member" = "PortunusAggUserDevices.type"
                            "operator" = "equals"
                            "values" = @(
                                "1"
                            )
                        }
                    )
                    "limit" = $TopCount
                    "ungrouped" = $false
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"

                $DFPClients = $Result.result.data | Select-Object @{name="device_name";Expression={$_.'PortunusAggUserDevices.device_name'}},`
                                             @{name="count";Expression={$_.'PortunusAggUserDevices.deviceCount'}} | Sort-Object count
                $DFPClients
            }
            "DHCP" {
                $DHCPHosts = Get-B1DHCPHost
                $splat = @{
                    "measures" = @(
                        "NstarLeaseActivity.total_count"
                    )
                    "dimensions" = @(
                        "NstarLeaseActivity.lease_ip",
                        "NstarLeaseActivity.host_id"
                    )
                    "timeDimensions" = @(
                        @{
                            "dimension" = "NstarLeaseActivity.timestamp"
                            "dateRange" = @(
                                $StartDate
                                $EndDate
                            )
                            "granularity" = $null
                        }
                    )
                    "filters" = @()
                    "limit" = $TopCount
                }
                $Data = $splat | ConvertTo-Json -Depth 4 -Compress
                $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
                $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"
    
                $DNSClients = $Result.result.data | Select-Object @{name="lease_ip";Expression={$_.'NstarLeaseActivity.lease_ip'}},`
                                             @{name="leaseCount";Expression={$_.'NstarLeaseActivity.total_count'}},`
                                             @{Name = 'DHCP-Server'; Expression = {$HostID = $_.'NstarLeaseActivity.host_id';if ($HostID) {($DHCPHosts | Where-Object {$_.id -eq $HostID}).name}}},`
                                             @{name="host_id";Expression={$_.'NstarLeaseActivity.host_id'}} | Sort-Object queryCount
                $DNSClients
                break
            }
            default {
                Write-Host "Error. Permitted TopClientLogType options are: DNS, DFP" -ForegroundColor Red
                break
            }
        }
    }
    if ($TopDNSServers) {
        $DNSHosts = Get-B1DNSHost
        $splat = @{
            "measures" = @(
                "NstarDnsActivity.total_count"
            )
            "dimensions" = @(
                "NstarDnsActivity.site_id"
            )
            "timeDimensions" = @(
                @{
                    "dimension" = "NstarDnsActivity.timestamp"
                    "dateRange" = @(
                        $StartDate
                        $EndDate
                    )
                    "granularity" = $Granularity
                }
            )
            "filters" = @()
            "limit" = $TopCount
        }
        $Data = $splat | ConvertTo-Json -Depth 4 -Compress
        $Query = [System.Web.HTTPUtility]::UrlEncode($Data)
        $Result = Query-CSP -Method "GET" -Uri "$(Get-B1CSPUrl)/api/cubejs/v1/query?query=$Query"
        if ($Granularity) {
            $Result.result.data | Select-Object @{Name = 'Timestamp'; Expression = {$_.'NstarDnsActivity.timestamp'}},@{Name = 'Count'; Expression = {$_.'NstarDnsActivity.total_count'}},@{Name = 'DNS-Server'; Expression = {$SiteID = $_.'NstarDnsActivity.site_id';if ($SiteID) {($DNSHosts | Where-Object {$_.site_id -eq $SiteID}).name}}},@{Name = 'SiteID'; Expression = {$_.'NstarDnsActivity.site_id'}}
        } else {
            $Result.result.data | Select-Object @{Name = 'Count'; Expression = {$_.'NstarDnsActivity.total_count'}},@{Name = 'DNS-Server'; Expression = {$SiteID = $_.'NstarDnsActivity.site_id';if ($SiteID) {($DNSHosts | Where-Object {$_.site_id -eq $SiteID}).name}}},@{Name = 'SiteID'; Expression = {$_.'NstarDnsActivity.site_id'}}
        }
    }
}