| 135 | } |
| 136 | |
| 137 | func createClient(backend string, prefix string, cfg StoreConfig, codec codec.Codec, role role, reg prometheus.Registerer, logger log.Logger) (Client, error) { |
| 138 | var client Client |
| 139 | var err error |
| 140 | |
| 141 | switch backend { |
| 142 | case "consul": |
| 143 | client, err = consul.NewClient(cfg.Consul, codec, logger, reg) |
| 144 | |
| 145 | case "etcd": |
| 146 | client, err = etcd.New(cfg.Etcd, codec, logger) |
| 147 | |
| 148 | case "inmemory": |
| 149 | // If we use the in-memory store, make sure everyone gets the same instance |
| 150 | // within the same process. |
| 151 | inmemoryStoreInit.Do(func() { |
| 152 | inmemoryStore, _ = consul.NewInMemoryClient(codec, logger, reg) |
| 153 | }) |
| 154 | // however we swap the codec so that we can encode different type of values. |
| 155 | client = inmemoryStore.WithCodec(codec) |
| 156 | |
| 157 | case "memberlist": |
| 158 | kv, err := cfg.MemberlistKV() |
| 159 | if err != nil { |
| 160 | return nil, err |
| 161 | } |
| 162 | client, err = memberlist.NewClient(kv, codec) |
| 163 | if err != nil { |
| 164 | return nil, err |
| 165 | } |
| 166 | |
| 167 | case "multi": |
| 168 | client, err = buildMultiClient(cfg, codec, reg, logger) |
| 169 | |
| 170 | // This case is for testing. The mock KV client does not do anything internally. |
| 171 | case "mock": |
| 172 | client, err = buildMockClient(logger) |
| 173 | |
| 174 | default: |
| 175 | return nil, fmt.Errorf("invalid KV store type: %s", backend) |
| 176 | } |
| 177 | |
| 178 | if err != nil { |
| 179 | return nil, err |
| 180 | } |
| 181 | |
| 182 | if prefix != "" { |
| 183 | client = PrefixClient(client, prefix) |
| 184 | } |
| 185 | |
| 186 | // If no Registerer is provided return the raw client. |
| 187 | if reg == nil { |
| 188 | return client, nil |
| 189 | } |
| 190 | |
| 191 | return newMetricsClient(backend, client, prometheus.WrapRegistererWith(role.Labels(), reg)), nil |
| 192 | } |
| 193 | |
| 194 | func buildMultiClient(cfg StoreConfig, codec codec.Codec, reg prometheus.Registerer, logger log.Logger) (Client, error) { |