Functions/BloxOne/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
        
        Available options: NXDOMAIN, NXRRSET, DNS & DFP

    .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
        
        Available options: DNS, DFP & DHCP

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

    .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

        Available options: Minute, Hour, Day, Week, Month & Year

    .PARAMETER Start
        The start date/time for searching aggregated metrics. Default is 1 day ago.

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

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

    .EXAMPLE
        PS> 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'}}
        }
    }
}