Compare commits
10 Commits
2e339cff36
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 439c481c60 | |||
| 0a58f85ca3 | |||
| 141c0e5100 | |||
| 9f3de791f9 | |||
| 8d3db70e01 | |||
| 831fed82f7 | |||
| 43887bb447 | |||
| 0b9b790986 | |||
| ae54bee23b | |||
| 84a8897bf0 |
+15
@@ -0,0 +1,15 @@
|
|||||||
|
FROM golang:1.26-trixie AS builder
|
||||||
|
WORKDIR /go/src/
|
||||||
|
COPY ./go.* ./
|
||||||
|
COPY ./cmd ./cmd/
|
||||||
|
COPY ./.vendor ./.vendor/
|
||||||
|
ENV CGO_ENABLED=0
|
||||||
|
RUN go build \
|
||||||
|
-o /go/bin/binary \
|
||||||
|
-mod=readonly \
|
||||||
|
-ldflags="-extldflags '-static'" \
|
||||||
|
./cmd/*/
|
||||||
|
FROM debian:trixie-slim AS runtime
|
||||||
|
COPY --from=builder /go/bin/binary /bin/binary
|
||||||
|
CMD []
|
||||||
|
ENTRYPOINT ["/bin/binary"]
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<header>
|
||||||
|
<script>
|
||||||
|
function onload() {
|
||||||
|
const results = [
|
||||||
|
{{ range $v := query
|
||||||
|
`
|
||||||
|
SELECT
|
||||||
|
start AS start
|
||||||
|
, CASE
|
||||||
|
WHEN ms < 50 AND ok THEN
|
||||||
|
'okay'
|
||||||
|
WHEN ms < 750 AND ok THEN
|
||||||
|
'slow'
|
||||||
|
ELSE
|
||||||
|
'bad'
|
||||||
|
END AS ok
|
||||||
|
, ms AS ms
|
||||||
|
FROM
|
||||||
|
"pinger_pings"
|
||||||
|
ORDER BY start DESC
|
||||||
|
LIMIT 1000
|
||||||
|
`
|
||||||
|
-}}
|
||||||
|
[
|
||||||
|
{{.ok}}==="okay"
|
||||||
|
? "🟢"
|
||||||
|
: {{.ok}}==="slow"
|
||||||
|
? "🟠"
|
||||||
|
: "🔴",
|
||||||
|
`${Math.round((new Date() - 1000*{{.start}})/1000.0)}s ago`,
|
||||||
|
new Date(1000*{{.start}}),
|
||||||
|
"{{.ms}}ms",
|
||||||
|
],
|
||||||
|
{{ end }}
|
||||||
|
]
|
||||||
|
document.getElementById("draw").innerHTML = results.map((r) => `<br>${JSON.stringify(r)}`).join("\n");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</header>
|
||||||
|
<body onload="onload()">
|
||||||
|
<div id="draw">
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
<footer>
|
||||||
|
</footer>
|
||||||
|
</html>
|
||||||
+30
-1
@@ -42,6 +42,7 @@ func run(ctx context.Context) error {
|
|||||||
defer wg.Wait()
|
defer wg.Wait()
|
||||||
for _, foo := range []func(context.Context) error{
|
for _, foo := range []func(context.Context) error{
|
||||||
s.pingAndRecord,
|
s.pingAndRecord,
|
||||||
|
s.collectGarbage,
|
||||||
s.listen,
|
s.listen,
|
||||||
} {
|
} {
|
||||||
foo := foo
|
foo := foo
|
||||||
@@ -141,6 +142,32 @@ func (s S) listen(ctx context.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s S) collectGarbage(ctx context.Context) error {
|
||||||
|
c := time.NewTicker(time.Hour)
|
||||||
|
defer c.Stop()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-c.C:
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if _, err := s.ExecContext(ctx, `
|
||||||
|
DELETE FROM "pinger_pings"
|
||||||
|
WHERE
|
||||||
|
start < $1
|
||||||
|
AND (
|
||||||
|
ms < 100
|
||||||
|
OR ok
|
||||||
|
)
|
||||||
|
`, time.Now().Add(-1*2*24*time.Hour).Unix()); err != nil {
|
||||||
|
log.Println("!", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s S) pingAndRecord(ctx context.Context) error {
|
func (s S) pingAndRecord(ctx context.Context) error {
|
||||||
ctx, can := context.WithCancel(ctx)
|
ctx, can := context.WithCancel(ctx)
|
||||||
defer can()
|
defer can()
|
||||||
@@ -187,7 +214,7 @@ func (s S) pingAndRecord(ctx context.Context) error {
|
|||||||
(start, ms, ok, to_id)
|
(start, ms, ok, to_id)
|
||||||
VALUES
|
VALUES
|
||||||
($1, $2, $3, $4)
|
($1, $2, $3, $4)
|
||||||
`, record.start, record.ms.Milliseconds(), record.ok, toId); err != nil {
|
`, record.start.Unix(), record.ms.Milliseconds(), record.ok, toId); err != nil {
|
||||||
log.Println("!", err)
|
log.Println("!", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,6 +251,8 @@ func (s S) pingAndRecord(ctx context.Context) error {
|
|||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
|
} else {
|
||||||
|
log.Println("!", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user