Sto analizzando le risposte dei nostri bilanciatori di carico Varnish per monitorare lo stato di vari nodi. Una delle risposte che otteniamo è un testo costituito da più blocchi di dati, uno per ogni server nel servizio di bilanciamento del carico.
Questo è uno di questi blocchi:
Backend web05 is Healthy
Current states good: 10 threshold: 8 window: 10
Average responsetime of good probes: 0.010285
Oldest Newest
================================================================
4444444444444444444444444444444444444444444444444444444444444444 Good IPv4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Good Xmit
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR Good Recv
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH-HHH-HHHHHHH---HHHHHHHH Happy
Questo verrà ripetuto (senza delimitatori specifici) per ogni backend che abbiamo.
Al momento sto semplicemente scorrendo le linee della risposta e sto cercando di estrarre bit di informazioni, finché non sembra che non ne possa più.
Il problema è che sembra abbastanza soggetto a errori.
Ecco una parte di quello che sto facendo. Sto lavorando in C #, se questo fa differenza ...
// The lines of the response are in a List<string> of lines...
while (n < response.Count)
{
// Spin until we find a line that marks the start of new block
if (!response[n].StartsWith("Backend "))
{
n++;
continue;
}
var summary = response[n++]; // first line is the summary line
var states = response[n++].Replace(" ", " "); // next is the state - remove any extraneous spaces
var averages = response[n++]; // the average response time line
if (response[n].EndsWith(" Good IPv4"))
{
goodIp4 = response[n++];
}
if (response[n].EndsWith(" Good Recv"))
{
goodRecv = response[n++];
}
if (response[n].EndsWith(" Happy"))
{
happy = response[n++];
}
# If we get this far, we are past the responses for this backend
# I parse out the name, states and averages from the "summary" and "average" lines
# Finally I take the health responses and create a List<boolean> from the 64 letter-codes
}
Sembra un po 'rozzo. Fondamentalmente sono in loop fino a quando non trovo l'inizio di un blocco, quindi consumo riga per riga fino all'ultima riga a cui sono interessato per quel blocco.
Si noti che il numero di tipi di risposta può variare, ad esempio potrebbe esserci una riga per "Recup. errori", ma che non viene restituita se non ce ne fossero.