18794: Merge branch 'main'
[arvados.git] / lib / config / load.go
index d03ef5388d901d9c51bda1a5cc5ef90fea1e7a62..8f8ab2bf27312adb76b6597ef1f51f8e21ecb338 100644 (file)
@@ -53,6 +53,8 @@ type Loader struct {
        // read configdata from, or the time when we read configdata
        // from a pipe.
        sourceTimestamp time.Time
+       // UTC time when configdata was read.
+       loadTimestamp time.Time
 }
 
 // NewLoader returns a new Loader with Stdin and Logger set to the
@@ -83,7 +85,7 @@ func (ldr *Loader) SetupFlags(flagset *flag.FlagSet) {
                flagset.StringVar(&ldr.CrunchDispatchSlurmPath, "legacy-crunch-dispatch-slurm-config", defaultCrunchDispatchSlurmConfigPath, "Legacy crunch-dispatch-slurm configuration `file`")
                flagset.StringVar(&ldr.WebsocketPath, "legacy-ws-config", defaultWebsocketConfigPath, "Legacy arvados-ws configuration `file`")
                flagset.StringVar(&ldr.KeepproxyPath, "legacy-keepproxy-config", defaultKeepproxyConfigPath, "Legacy keepproxy configuration `file`")
-               flagset.StringVar(&ldr.GitHttpdPath, "legacy-git-httpd-config", defaultGitHttpdConfigPath, "Legacy arv-git-httpd configuration `file`")
+               flagset.StringVar(&ldr.GitHttpdPath, "legacy-git-httpd-config", defaultGitHttpdConfigPath, "Legacy arvados-git-httpd configuration `file`")
                flagset.StringVar(&ldr.KeepBalancePath, "legacy-keepbalance-config", defaultKeepBalanceConfigPath, "Legacy keep-balance configuration `file`")
                flagset.BoolVar(&ldr.SkipLegacy, "skip-legacy", false, "Don't load legacy config files")
        }
@@ -173,32 +175,36 @@ func (ldr *Loader) MungeLegacyConfigArgs(lgr logrus.FieldLogger, args []string,
        return munged
 }
 
-func (ldr *Loader) loadBytes(path string) ([]byte, time.Time, error) {
+func (ldr *Loader) loadBytes(path string) (buf []byte, sourceTime, loadTime time.Time, err error) {
+       loadTime = time.Now().UTC()
        if path == "-" {
-               buf, err := ioutil.ReadAll(ldr.Stdin)
-               return buf, time.Now().UTC(), err
+               buf, err = ioutil.ReadAll(ldr.Stdin)
+               sourceTime = loadTime
+               return
        }
        f, err := os.Open(path)
        if err != nil {
-               return nil, time.Time{}, err
+               return
        }
        defer f.Close()
        fi, err := f.Stat()
        if err != nil {
-               return nil, time.Time{}, err
+               return
        }
-       buf, err := ioutil.ReadAll(f)
-       return buf, fi.ModTime().UTC(), err
+       sourceTime = fi.ModTime().UTC()
+       buf, err = ioutil.ReadAll(f)
+       return
 }
 
 func (ldr *Loader) Load() (*arvados.Config, error) {
        if ldr.configdata == nil {
-               buf, t, err := ldr.loadBytes(ldr.Path)
+               buf, sourceTime, loadTime, err := ldr.loadBytes(ldr.Path)
                if err != nil {
                        return nil, err
                }
                ldr.configdata = buf
-               ldr.sourceTimestamp = t
+               ldr.sourceTimestamp = sourceTime
+               ldr.loadTimestamp = loadTime
        }
 
        // FIXME: We should reject YAML if the same key is used twice
@@ -579,12 +585,22 @@ func (ldr *Loader) autofillPreemptible(label string, cc *arvados.Cluster) {
 // called before Load(). Metrics are not updated by subsequent calls
 // to Load().
 func (ldr *Loader) RegisterMetrics(reg *prometheus.Registry) {
+       hash := fmt.Sprintf("%x", sha256.Sum256(ldr.configdata))
        vec := prometheus.NewGaugeVec(prometheus.GaugeOpts{
                Namespace: "arvados",
                Subsystem: "config",
                Name:      "source_timestamp_seconds",
                Help:      "Timestamp of config file when it was loaded.",
        }, []string{"sha256"})
-       vec.WithLabelValues(fmt.Sprintf("%x", sha256.Sum256(ldr.configdata))).Set(float64(ldr.sourceTimestamp.UnixNano()) / 1e9)
+       vec.WithLabelValues(hash).Set(float64(ldr.sourceTimestamp.UnixNano()) / 1e9)
+       reg.MustRegister(vec)
+
+       vec = prometheus.NewGaugeVec(prometheus.GaugeOpts{
+               Namespace: "arvados",
+               Subsystem: "config",
+               Name:      "load_timestamp_seconds",
+               Help:      "Time when config file was loaded.",
+       }, []string{"sha256"})
+       vec.WithLabelValues(hash).Set(float64(ldr.loadTimestamp.UnixNano()) / 1e9)
        reg.MustRegister(vec)
 }