Skip to content
Snippets Groups Projects
Select Git revision
  • main default protected
  • v3.0
  • v3-alpha-1
  • v2.0
  • v1.1.0
  • v1.0.0
6 results

monitor_postgres.go

Blame
  • monitor_postgres.go 1.09 KiB
    package main
    
    import (
    	"database/sql"
    	"fmt"
    	_ "github.com/lib/pq"
    	"github.com/sirupsen/logrus"
    	"time"
    )
    
    type PostgresMonitor struct {
    	config ConfigComponent
    }
    
    func NewPostgresMonitor(config ConfigComponent) *PostgresMonitor {
    	return &PostgresMonitor{
    		config: config,
    	}
    }
    
    func (m *PostgresMonitor) Config() *ConfigComponent {
    	return &m.config
    }
    
    func (m *PostgresMonitor) Measure() (Datapoint, error) {
    	sslMode := "verify-full"
    	if m.config.Postgres.Insecure {
    		sslMode = "allow"
    	}
    	connStr := fmt.Sprintf(
    		"postgres://%s:%s@%s:%d/%s?sslmode=%s",
    		m.config.Postgres.Username,
    		m.config.Postgres.Password,
    		m.config.Postgres.Hostname,
    		m.config.Postgres.Port,
    		m.config.Postgres.Database,
    		sslMode,
    	)
    	before := time.Now()
    	db, err := sql.Open("postgres", connStr)
    	after := time.Now()
    	latency := int(after.Sub(before).Nanoseconds() / 1000000)
    	defer db.Close()
    	if err != nil {
    		logrus.Infof("Monitor %s: %s", err)
    		return Datapoint{
    			Time:    after,
    			Up:      false,
    			Latency: latency,
    		}, nil
    	}
    
    	return Datapoint{
    		Time:    after,
    		Up:      true,
    		Latency: latency,
    	}, nil
    }