Skip to content

Commit 00cbda7

Browse files
committed
Fix go-kit compile
Signed-off-by: Drasko Draskovic <[email protected]>
1 parent 41cf24e commit 00cbda7

File tree

1,801 files changed

+1775
-4621
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,801 files changed

+1775
-4621
lines changed

cmd/main.go

+161-40
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,185 @@
1+
// Copyright (c) Mainflux
2+
// SPDX-License-Identifier: Apache-2.0
3+
14
package main
25

36
import (
4-
"html/template"
7+
"fmt"
8+
"io"
9+
"io/ioutil"
10+
"log"
511
"net/http"
6-
7-
"github.com/go-chi/chi"
8-
"github.com/go-chi/chi/middleware"
12+
"os"
13+
"os/signal"
14+
"strconv"
15+
"syscall"
16+
"time"
17+
18+
"google.golang.org/grpc/credentials"
19+
20+
"github.com/drasko/gui/gui"
21+
"github.com/drasko/gui/gui/api"
22+
kitprometheus "github.com/go-kit/kit/metrics/prometheus"
23+
"github.com/mainflux/mainflux"
24+
"github.com/mainflux/mainflux/logger"
25+
thingsapi "github.com/mainflux/mainflux/things/api/auth/grpc"
26+
"github.com/opentracing/opentracing-go"
27+
stdprometheus "github.com/prometheus/client_golang/prometheus"
28+
jconfig "github.com/uber/jaeger-client-go/config"
29+
"google.golang.org/grpc"
930
)
1031

1132
const (
12-
staticDir = "gui/static"
33+
defLogLevel = "error"
34+
defClientTLS = "false"
35+
defCACerts = ""
36+
defPort = "8180"
37+
defJaegerURL = ""
38+
defThingsAuthURL = "localhost:8181"
39+
defThingsAuthTimeout = "1s"
40+
41+
envLogLevel = "MF_GUI_LOG_LEVEL"
42+
envClientTLS = "MF_GUI_CLIENT_TLS"
43+
envCACerts = "MF_GUI_CA_CERTS"
44+
envPort = "MF_GUI_PORT"
45+
envNatsURL = "MF_NATS_URL"
46+
envJaegerURL = "MF_JAEGER_URL"
47+
envThingsAuthURL = "MF_THINGS_AUTH_GRPC_URL"
48+
envThingsAuthTimeout = "MF_THINGS_AUTH_GRPC_TIMEOUT"
1349
)
1450

15-
var (
16-
t *template.Template
17-
)
51+
type config struct {
52+
natsURL string
53+
logLevel string
54+
port string
55+
clientTLS bool
56+
caCerts string
57+
jaegerURL string
58+
thingsAuthURL string
59+
thingsAuthTimeout time.Duration
60+
}
1861

19-
func indexHandler(w http.ResponseWriter, r *http.Request) {
62+
func main() {
63+
cfg := loadConfig()
2064

21-
data := struct {
22-
Name string
23-
}{"John Smith"}
65+
logger, err := logger.New(os.Stdout, cfg.logLevel)
66+
if err != nil {
67+
log.Fatalf(err.Error())
68+
}
2469

25-
t.ExecuteTemplate(w, "index", data)
70+
conn := connectToThings(cfg, logger)
71+
defer conn.Close()
72+
73+
tracer, closer := initJaeger("gui", cfg.jaegerURL, logger)
74+
defer closer.Close()
75+
76+
thingsTracer, thingsCloser := initJaeger("things", cfg.jaegerURL, logger)
77+
defer thingsCloser.Close()
78+
79+
tc := thingsapi.NewClient(conn, thingsTracer, cfg.thingsAuthTimeout)
80+
svc := gui.New(tc)
81+
82+
svc = api.LoggingMiddleware(svc, logger)
83+
svc = api.MetricsMiddleware(
84+
svc,
85+
kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
86+
Namespace: "gui",
87+
Subsystem: "api",
88+
Name: "request_count",
89+
Help: "Number of requests received.",
90+
}, []string{"method"}),
91+
kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
92+
Namespace: "gui",
93+
Subsystem: "api",
94+
Name: "request_latency_microseconds",
95+
Help: "Total duration of requests in microseconds.",
96+
}, []string{"method"}),
97+
)
98+
99+
errs := make(chan error, 2)
100+
101+
go func() {
102+
p := fmt.Sprintf(":%s", cfg.port)
103+
logger.Info(fmt.Sprintf("GUI service started on port %s", cfg.port))
104+
errs <- http.ListenAndServe(p, api.MakeHandler(svc, tracer))
105+
}()
106+
107+
go func() {
108+
c := make(chan os.Signal)
109+
signal.Notify(c, syscall.SIGINT)
110+
errs <- fmt.Errorf("%s", <-c)
111+
}()
112+
113+
err = <-errs
114+
logger.Error(fmt.Sprintf("GUI service terminated: %s", err))
26115
}
27116

28-
func thingsHandler(w http.ResponseWriter, r *http.Request) {
29-
data := struct {
30-
Name string
31-
}{"John Smith"}
32-
33-
t.ExecuteTemplate(w, "things", data)
34-
}
117+
func loadConfig() config {
118+
tls, err := strconv.ParseBool(mainflux.Env(envClientTLS, defClientTLS))
119+
if err != nil {
120+
log.Fatalf("Invalid value passed for %s\n", envClientTLS)
121+
}
35122

36-
func channelsHandler(w http.ResponseWriter, r *http.Request) {
37-
data := struct {
38-
Name string
39-
}{"John Smith"}
123+
authTimeout, err := time.ParseDuration(mainflux.Env(envThingsAuthTimeout, defThingsAuthTimeout))
124+
if err != nil {
125+
log.Fatalf("Invalid %s value: %s", envThingsAuthTimeout, err.Error())
126+
}
40127

41-
t.ExecuteTemplate(w, "channels", data)
128+
return config{
129+
logLevel: mainflux.Env(envLogLevel, defLogLevel),
130+
port: mainflux.Env(envPort, defPort),
131+
clientTLS: tls,
132+
caCerts: mainflux.Env(envCACerts, defCACerts),
133+
jaegerURL: mainflux.Env(envJaegerURL, defJaegerURL),
134+
thingsAuthURL: mainflux.Env(envThingsAuthURL, defThingsAuthURL),
135+
thingsAuthTimeout: authTimeout,
136+
}
42137
}
43138

44-
func main() {
45-
r := chi.NewRouter()
46-
r.Use(middleware.Logger)
139+
func initJaeger(svcName, url string, logger logger.Logger) (opentracing.Tracer, io.Closer) {
140+
if url == "" {
141+
return opentracing.NoopTracer{}, ioutil.NopCloser(nil)
142+
}
47143

48-
// Serve static files
49-
fs := http.FileServer(http.Dir(staticDir))
50-
r.Handle("/*", fs)
144+
tracer, closer, err := jconfig.Configuration{
145+
ServiceName: svcName,
146+
Sampler: &jconfig.SamplerConfig{
147+
Type: "const",
148+
Param: 1,
149+
},
150+
Reporter: &jconfig.ReporterConfig{
151+
LocalAgentHostPort: url,
152+
LogSpans: true,
153+
},
154+
}.NewTracer()
155+
if err != nil {
156+
logger.Error(fmt.Sprintf("Failed to init Jaeger client: %s", err))
157+
os.Exit(1)
158+
}
51159

52-
// Routes
53-
r.Get("/", indexHandler)
54-
r.Get("/things", thingsHandler)
55-
r.Get("/channels", channelsHandler)
160+
return tracer, closer
161+
}
56162

57-
var err error
58-
t, err = template.ParseGlob("gui/views/*")
59-
if err != nil {
60-
panic(err)
163+
func connectToThings(cfg config, logger logger.Logger) *grpc.ClientConn {
164+
var opts []grpc.DialOption
165+
if cfg.clientTLS {
166+
if cfg.caCerts != "" {
167+
tpc, err := credentials.NewClientTLSFromFile(cfg.caCerts, "")
168+
if err != nil {
169+
logger.Error(fmt.Sprintf("Failed to load certs: %s", err))
170+
os.Exit(1)
171+
}
172+
opts = append(opts, grpc.WithTransportCredentials(tpc))
173+
}
174+
} else {
175+
logger.Info("gRPC communication is not encrypted")
176+
opts = append(opts, grpc.WithInsecure())
61177
}
62178

63-
http.ListenAndServe(":3000", r)
179+
conn, err := grpc.Dial(cfg.thingsAuthURL, opts...)
180+
if err != nil {
181+
logger.Error(fmt.Sprintf("Failed to connect to things service: %s", err))
182+
os.Exit(1)
183+
}
184+
return conn
64185
}

go.mod

+12-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,15 @@ module github.com/drasko/gui
22

33
go 1.15
44

5-
require github.com/go-chi/chi v1.5.1
5+
require (
6+
github.com/go-chi/chi v1.5.1
7+
github.com/go-kit/kit v0.10.0
8+
github.com/go-zoo/bone v1.3.0
9+
github.com/golang/protobuf v1.4.3
10+
github.com/mainflux/mainflux v0.11.0
11+
github.com/opentracing/opentracing-go v1.2.0
12+
github.com/prometheus/client_golang v1.9.0
13+
github.com/stretchr/testify v1.6.1
14+
github.com/uber/jaeger-client-go v2.23.1+incompatible
15+
google.golang.org/grpc v1.34.0
16+
)

0 commit comments

Comments
 (0)