Application Insights makes automatic ip lookup for your telemetry. Geo information can be quite useful for monitoring, troubleshooting and usage scenarios.
I already wrote about IP address collection. Application Insights collects an IP address of the monitored service visitor. So you can group telemetry by the country of origin. This will allow to filter out long executing AJAX calls made from the countries with high latency or group usage metrics by “nighttime” visitors vs. “daytime” visitors.
For instance, this query demonstrates that not all availability tests locations geo mapped correctly by Application Insights.
availabilityResults | where timestamp > ago(10m) | join (requests | where timestamp > ago(10m)) on $left.id == $right.session_Id | extend originatingLocation = location, recievedLocation = strcat(client_CountryOrRegion, " ", client_StateOrProvince, " ", client_City) | summarize count() by originatingLocation, recievedLocation, client_IP
This is a resultgin view. Note, some locations were not correctly mapped and some do not have city associated with it:
|US : CA-San Jose||United States California San Jose||220.127.116.11|
|US : FL-Miami||United States Florida Miami||18.104.22.168|
|US : TX-San Antonio||United States Texas San Antonio||22.214.171.124|
|NL : Amsterdam||Netherlands North Holland Amsterdam||126.96.36.199|
|US : IL-Chicago||United States Illinois Chicago||188.8.131.52|
|IE : Dublin||Ireland Leinster Dublin||184.108.40.206|
|JP : Kawaguchi||Japan Tokyo Tokyo||220.127.116.11|
|RU : Moscow||United Kingdom||18.104.22.168|
|CH : Zurich||United Kingdom||22.214.171.124|
|HK : Hong Kong||Hong Kong Long Keng||126.96.36.199|
|AU : Sydney||United States Washington Redmond||188.8.131.52|
|BR : Sao Paulo||Brazil Sao Paulo São Paulo||184.108.40.206|
|SE : Stockholm||United Kingdom||220.127.116.11|
|SG : Singapore||United States Delaware Wilmington||18.104.22.168|
|US : VA-Ashburn||United States||22.214.171.124|
|FR : Paris||United Kingdom||126.96.36.199|
Try this query yourself for an up to date information.
I authored a simple query to check whether my blog is read during the day or night. This demo is not produciton ready and I might have messed with the timezones. However for an adhoc analysis it was OK. It also demonstrates the use of the operators
datatable and the power of
let timezones = datatable (timezone_location:string, shift:time) [ "United States", time(-6h), "Canada", time(-6h), "Japan", time(9h), "Brazil", time(-3h), "United Kingdom", time(0), "Hong Kong", time(8h), "Ireland", time(0), "Switzerland", time(2h), "Slovenia", time(1h), "South Africa", time(2h), "Sweden", time(1h), "Poland", time(1h), "Ukraine", time(2h), "Netherlands", time(2h), ]; pageViews | extend timezone_location = client_CountryOrRegion | where timestamp > ago(10h) and timestamp < ago(5h) | join kind= leftouter ( timezones ) on timezone_location | extend localtimehour = datepart("Hour", timestamp + shift) | project name, timezone_location, timestamp, localtimehour, isDay = iff(localtimehour > 5 and localtimehour < 20, "day", "night") | summarize count() by isDay | render piechart
Here is the result view: