databaseMng.go 2.2 KB
Newer Older
T
tanggen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
// Copyright (C) 2020 Finogeeks Co., Ltd
//
// This program is free software: you can redistribute it and/or  modify
// it under the terms of the GNU Affero General Public License, version 3,
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

package common

import (
	"errors"
	"log"
	"sync"

	"github.com/finogeeks/ligase/core"
	mon "github.com/finogeeks/ligase/skunkworks/monitor/go-client/monitor"
	"github.com/finogeeks/ligase/storage/model"
)

var (
	regMu      sync.RWMutex
	dbMap      sync.Map
	newHandler = make(map[string]func(string, string, string, string, string, bool) (interface{}, error))
	gauge      mon.LabeledGauge
	once       sync.Once
)

//can't use skunkworks log
func Register(name string, f func(string, string, string, string, string, bool) (interface{}, error)) {
	regMu.Lock()
	defer regMu.Unlock()

	log.Printf("DatabaseMng Register: %s\n", name)
	if f == nil {
		log.Panicf("DatabaseMng Register: %s func nil\n", name)
	}

	if _, ok := newHandler[name]; ok {
		log.Panicf("DatabaseMng Register: %s already registered\n", name)
	}

	newHandler[name] = f
}

func GetDBInstance(name string, cfg core.IConfig) (interface{}, error) {
	driver, createAddr, address, underlying, topic, useSync := cfg.GetDBConfig(name)
	f := newHandler[name]
	if f == nil {
		return nil, errors.New("unknown db " + name)
	}

	val, ok := dbMap.Load(name)
	if ok {
		return val, nil
	}

	val, err := f(driver, createAddr, address, underlying, topic, useSync)
	if err != nil {
		return nil, err
	}
	dbMap.Store(name, val)

	dbMon := val.(model.DBMonitor)
	dbMon.SetGauge(GetGaugeInstance())

	return val, err
}

func GetGaugeInstance() mon.LabeledGauge {
	monitor := mon.GetInstance()

	once.Do(func() {
		gauge = monitor.NewLabeledGauge("storage_query_duration_millisecond", []string{"process"})
	})
	return gauge
}