maximale query time herausfinden für Monitoring

Hi Leute,

Wir wollen unseren Postgres Datenbank Server besser überwachen, z.B. einzelne Querys auf ihre Zeit prüfen. Das heisst wenn ein Query länger wie 3 Sek. braucht sollte eine Mail an den Admin geschickt werden. Im Prinzip geht es mir einfach nur um die SQL Abfrage wie ich einen solchen langen Query rausfischen kann.
Postgres bietet ja eine Überwachung durch den Statistics Collector an, welche auch sehr hilfreich ist.

Immoment sieht die Abfrage wie folgt aus:

SELECT max(now() - xact_start ) AS start FROM pg_catalog.pg_stat_activity ;

Rückgabe:
start ----------
00:00:00
(1 row)

Da ich ein Neueinsteiger bei Postgres bin, bin ich mir nicht ganz sicher ob das so richtig ist. Leider kann ich es auch nicht testen da ich keinen Query hinbekomme der länger als 1 sek dauert, die Rückgabe ist leider nicht im millisekunden Bereich.

Gibt es eine Möglichkeit die Querys zeitgleich zu überwachen?

Vielleicht weiss hier ja jemannd weiter, bin für jeden Tipp dankbar!

Also, eine Lösung, daß da eine Mail verschickt wird, kenne ich nicht, aber Du kannst log_min_duration_statement passend setzen (per Connection, per User, global, …), dann landet das im Log. Es gibt sicher Tools, die das Log in Echtzeit beobachten und da eine Mail schicken…

Ansonsten mit Deiner Abfrage: now() liefert die Startzeit der aktuellen TX (nicht die aktuelle Zeit!), die Zeit zwischen Start einer TX und der Startzeit der aktuellen TX ist aber nicht zwingend die Laufzeit einer Abfrage. Ach ja: es gibt pg_sleep(), darfst ca. 3 mal raten, was die macht :wink:


Du solltest vielleicht mal einen Blick auf pgFouine - a PostgreSQL log analyzer werfen.

Andreas

Das mit der Mail wird dann über ein Shellscript gelöst :p

Das bedeutet meine SQL abfrage ist eigentlich totaler quatsch :smiley: . pg_sleep() hat mir sehr weiter geholfen damit kann ich nun richtig testen, coole function!

Der Log analyzer sieht auch sehr interessant, vorerst will ich es aber noch probieren ob ich die “query time” direkt an der Datenbank abzwicken kann ohne über ein Logfile zu gehen.

Im pgAdmin bekomme ich ja über Tools/Server Status die aktuell ausgeführten queries angezeigt, soweit ich weiss greift er einfach auf die Views pg_stat_activity zu. Dort bekomme ich die Startzeit des queries angezeigt, das heisst ich kann die von der aktuellen zeit abziehen, hätte so theoretisch meine query time. :rolleyes:

Danke für die tipps :wink:

Ja, aber ich bin mir nicht sicher, ob Du permanent da (im Abstand von Millisekunden …) da Abfragen abballern willst, um somit ein ‘Monitoring’ zu bekommen…

Andreas

hast recht :smiley:

Also, eine Lösung, daß da eine Mail verschickt wird, kenne ich nicht, aber Du kannst log_min_duration_statement passend setzen (per Connection, per User, global, …), dann landet das im Log. Es gibt sicher Tools, die das Log in Echtzeit beobachten und da eine Mail schicken…

Das mit dem Logfile klappt super! Ich denke wir werden das so umsetzen :wink:

Ähem “log_min_duration_statement” loggt erst wenn die Anfrage zu Ende ist.
Wenn das ein paar Stunden (warum auch immer) läuft oder zum Beispiel auf einen LOCK wartet, landet das (noch) nicht im Logfile.