I was just too late to reply to this topic: Monitor uptime is not shown
So I'll reply in this new topic:
Hi @emilioalvap,
I tried the query you provided and I do get hits for all the browser monitors that I expect.
I did some searching and managed to log the query that elasticsearch is receiving to get the total up and down count:
{
"size": 0,
"query":
{
"match_none":
{
"boost": 1.0
}
},
"aggregations":
{
"counts":
{
"scripted_metric":
{
"init_script":
{
"source": "state.locStatus = new HashMap(); state.totalDocs = 0;",
"lang": "painless"
},
"map_script":
{
"source": "\n def loc = doc[\"observer.geo.name\"].size() == 0 ? \"\" : doc[\"observer.geo.name\"][0];\n\n // One concern here is memory since we could build pretty gigantic maps. I've opted to\n // stick to a simple <String,String> map to reduce memory overhead. This means we do\n // a little string parsing to treat these strings as records that stay lexicographically\n // sortable (which is important later).\n // We encode the ID and location as $id.len:$id$loc\n String id = doc[\"monitor.id\"][0];\n String idLenDelim = Integer.toHexString(id.length()) + \":\" + id;\n String idLoc = loc == null ? idLenDelim : idLenDelim + loc;\n\n String status = doc[\"summary.down\"][0] > 0 ? \"d\" : \"u\";\n String timeAndStatus = doc[\"@timestamp\"][0].toInstant().toEpochMilli().toString() + status;\n if(state.locStatus[idLoc] == null){\n state.locStatus[idLoc] = timeAndStatus;\n }else if(timeAndStatus.compareTo(state.locStatus[idLoc]) > 0){\n state.locStatus[idLoc] = timeAndStatus;\n }\n\n state.totalDocs++;\n ",
"lang": "painless"
},
"combine_script":
{
"source": "\n return state;\n ",
"lang": "painless"
},
"reduce_script":
{
"source": "\n // Use a treemap since it's traversable in sorted order.\n // This is important later.\n TreeMap locStatus = new TreeMap();\n long totalDocs = 0;\n int uniqueIds = 0;\n for (state in states) {\n totalDocs += state.totalDocs;\n for (entry in state.locStatus.entrySet()) {\n // Update the value for the given key if we have a more recent check from this location.\n locStatus.merge(entry.getKey(), entry.getValue(), (a,b) -> a.compareTo(b) > 0 ? a : b)\n }\n }\n\n HashMap locTotals = new HashMap();\n int total = 0;\n int down = 0;\n String curId = \"\";\n boolean curIdDown = false;\n // We now iterate through our tree map in order, which means records for a given ID\n // always are encountered one after the other. This saves us having to make an intermediate\n // map.\n for (entry in locStatus.entrySet()) {\n String idLoc = entry.getKey();\n String timeStatus = entry.getValue();\n\n // Parse the length delimited id/location strings described in the map section\n int colonIndex = idLoc.indexOf(\":\");\n int idEnd = Integer.parseInt(idLoc.substring(0, colonIndex), 16) + colonIndex + 1;\n String id = idLoc.substring(colonIndex + 1, idEnd);\n String loc = idLoc.substring(idEnd, idLoc.length());\n String status = timeStatus.substring(timeStatus.length() - 1);\n\n // Here we increment counters for the up/down key per location\n // We also create a new hashmap in locTotals if we've never seen this location\n // before.\n locTotals.compute(loc, (k,v) -> {\n HashMap res = v;\n if (v == null) {\n res = new HashMap();\n res.put('up', 0);\n res.put('down', 0);\n }\n\n if (status == 'u') {\n res.up++;\n } else {\n res.down++;\n }\n\n return res;\n });\n\n\n // We've encountered a new ID\n if (curId != id) {\n total++;\n curId = id;\n if (status == \"d\") {\n curIdDown = true;\n down++;\n } else {\n curIdDown = false;\n }\n } else if (!curIdDown) {\n if (status == \"d\") {\n curIdDown = true;\n down++;\n } else {\n curIdDown = false;\n }\n }\n }\n\n Map result = new HashMap();\n result.total = total;\n result.location_totals = locTotals;\n result.up = total - down;\n result.down = down;\n result.totalDocs = totalDocs;\n return result;\n ",
"lang": "painless"
}
}
}
}
}
It and it is only run for the following indexes:
- .ds-synthetics-browser.network-default-2023.05.17-000002
- .ds-heartbeat-8.6.1-2023.04.14-000001
And not for .ds-synthetics-browser-default-2023.05.17-000002 that I expect to be used.
Any idea why it is not checking all indexes?
Kind regards,
Sam Verhoeven