Skip to content

Commit

Permalink
feat: reuse jira clients to reuse connections
Browse files Browse the repository at this point in the history
Signed-off-by: Luis Davim <dluis@vmware.com>
  • Loading branch information
luisdavim committed Oct 7, 2022
1 parent 43a23d5 commit d2aa028
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 18 deletions.
22 changes: 4 additions & 18 deletions cmd/jiralert/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ import (
"runtime"
"strconv"

"github.com/andygrunwald/go-jira"

"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/prometheus-community/jiralert/pkg/alertmanager"
"github.com/prometheus-community/jiralert/pkg/clientset"
"github.com/prometheus-community/jiralert/pkg/config"
"github.com/prometheus-community/jiralert/pkg/notify"
"github.com/prometheus-community/jiralert/pkg/template"
Expand Down Expand Up @@ -83,6 +82,8 @@ func main() {
os.Exit(1)
}

var cs clientset.ClientSet

http.HandleFunc("/alert", func(w http.ResponseWriter, req *http.Request) {
level.Debug(logger).Log("msg", "handling /alert webhook request")
defer func() { _ = req.Body.Close() }()
Expand All @@ -101,22 +102,7 @@ func main() {
}
level.Debug(logger).Log("msg", " matched receiver", "receiver", conf.Name)

// TODO: Consider reusing notifiers or just jira clients to reuse connections.
var client *jira.Client
var err error
if conf.User != "" && conf.Password != "" {
tp := jira.BasicAuthTransport{
Username: conf.User,
Password: string(conf.Password),
}
client, err = jira.NewClient(tp.Client(), conf.APIURL)
} else if conf.PersonalAccessToken != "" {
tp := jira.PATAuthTransport{
Token: string(conf.PersonalAccessToken),
}
client, err = jira.NewClient(tp.Client(), conf.APIURL)
}

client, err := cs.GetOrCreateJira(conf)
if err != nil {
errorHandler(w, http.StatusInternalServerError, err, conf.Name, &data, logger)
return
Expand Down
81 changes: 81 additions & 0 deletions pkg/clientset/clientset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Copyright 2017 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package clientset

import (
"errors"
"fmt"
"sync"

"github.com/andygrunwald/go-jira"
"github.com/prometheus-community/jiralert/pkg/config"
)

type ClientSet struct {
jira map[string]*jira.Client
sync.RWMutex
}

var ErrorClientExists = errors.New("client already exists")

func (c *ClientSet) GetJira(userName string) (*jira.Client, bool) {
c.RLock()
jc, ok := c.jira[userName]
c.RUnlock()

return jc, ok
}

func (c *ClientSet) NewJira(conf *config.ReceiverConfig) (*jira.Client, error) {
if conf == nil {
return nil, fmt.Errorf("missing receiver config")
}

if jc, ok := c.GetJira(conf.User); ok {
return jc, fmt.Errorf("jira %w: %s", ErrorClientExists, conf.User)
}

var (
client *jira.Client
err error
)
if conf.User != "" && conf.Password != "" {
tp := jira.BasicAuthTransport{
Username: conf.User,
Password: string(conf.Password),
}
client, err = jira.NewClient(tp.Client(), conf.APIURL)
} else if conf.PersonalAccessToken != "" {
tp := jira.PATAuthTransport{
Token: string(conf.PersonalAccessToken),
}
client, err = jira.NewClient(tp.Client(), conf.APIURL)
}

if err == nil {
c.Lock()
c.jira[conf.User] = client
c.Unlock()
}

return client, err
}

func (c *ClientSet) GetOrCreateJira(conf *config.ReceiverConfig) (*jira.Client, error) {
jc, err := c.NewJira(conf)
if errors.Is(err, ErrorClientExists) {
err = nil
}
return jc, err
}

0 comments on commit d2aa028

Please sign in to comment.