From 9d7f4544c7d140e66c74a5a503834e01866d1559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Borov=C4=8Danin?= Date: Fri, 1 Jun 2018 11:20:44 +0200 Subject: [PATCH] MF-296 - Create docker-compose with InfluxDB and Grafana (#306) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add docker-compose Update README.md accordingly. Signed-off-by: Dušan Borovčanin * Move writer compose files to root docker dir Signed-off-by: Dušan Borovčanin * Remove Point from InfluxDB writer config Update docs. Signed-off-by: Dušan Borovčanin --- cmd/influxdb/main.go | 5 +-- docker/addons/influxdb/docker-compose.yml | 49 +++++++++++++++++++++++ writers/influxdb/README.md | 17 ++++++-- writers/influxdb/influxdb.go | 13 +++--- writers/influxdb/influxdb_test.go | 2 +- 5 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 docker/addons/influxdb/docker-compose.yml diff --git a/cmd/influxdb/main.go b/cmd/influxdb/main.go index 030502cd..08edb606 100644 --- a/cmd/influxdb/main.go +++ b/cmd/influxdb/main.go @@ -33,7 +33,6 @@ const ( envNatsURL = "MF_NATS_URL" envPort = "MF_INFLUX_WRITER_PORT" envDBName = "MF_INFLUX_WRITER_DB_NAME" - envDBPoint = "MF_INFLUX_WRITER_DB_POINT" envDBHost = "MF_INFLUX_WRITER_DB_HOST" envDBPort = "MF_INFLUX_WRITER_DB_PORT" envDBUser = "MF_INFLUX_WRITER_DB_USER" @@ -44,7 +43,6 @@ type config struct { NatsURL string Port string DBName string - DBPoint string DBHost string DBPort string DBUser string @@ -69,7 +67,7 @@ func main() { } defer client.Close() - repo, err := influxdb.New(client, cfg.DBName, cfg.DBPoint) + repo, err := influxdb.New(client, cfg.DBName) if err != nil { logger.Error(fmt.Sprintf("Failed to create InfluxDB writer: %s", err.Error())) os.Exit(1) @@ -99,7 +97,6 @@ func loadConfigs() (config, influxdata.HTTPConfig) { NatsURL: mainflux.Env(envNatsURL, defNatsURL), Port: mainflux.Env(envPort, defPort), DBName: mainflux.Env(envDBName, defDBName), - DBPoint: mainflux.Env(envDBPoint, defPointName), DBHost: mainflux.Env(envDBHost, defDBHost), DBPort: mainflux.Env(envDBPort, defDBPort), DBUser: mainflux.Env(envDBUser, defDBUser), diff --git a/docker/addons/influxdb/docker-compose.yml b/docker/addons/influxdb/docker-compose.yml new file mode 100644 index 00000000..8b33b235 --- /dev/null +++ b/docker/addons/influxdb/docker-compose.yml @@ -0,0 +1,49 @@ +### +# This docker-compose file contains optional InfluxDB, InfluxDB-writer and Grafana services +# for Mainflux platform. Since these are optional, this file is dependent of docker-compose file +# from /docker. In order to run these optional service, execute command: +# docker-compose -f docker/docker-compose.yml -f docker/addons/influxdb/docker-compose.yml up +# from project root. +### + +version: "3" + +services: + + influxdb: + image: influxdb:1.5.2-alpine + container_name: mainflux-influxdb + restart: on-failure + environment: + INFLUXDB_DB: mainflux + INFLUXDB_ADMIN_USER: mainflux + INFLUXDB_ADMIN_PASSWORD: mainflux + + influxdb-writer: + image: mainflux/influxdb:latest + container_name: mainflux-influxdb-writer + depends_on: + - influxdb + - nats + expose: + - 8900 + restart: on-failure + environment: + MF_NATS_URL: nats://nats:4222 + MF_INFLUX_WRITER_PORT: 8900 + MF_INFLUX_WRITER_DB_NAME: mainflux + MF_INFLUX_WRITER_DB_HOST: influxdb + MF_INFLUX_WRITER_DB_PORT: 8086 + MF_INFLUX_WRITER_DB_USER: mainflux + MF_INFLUX_WRITER_DB_PASS: mainflux + ports: + - 8900:8900 + + grafana: + image: grafana/grafana:5.1.3 + container_name: mainflux-grafana + depends_on: + - influxdb + restart: on-failure + ports: + - 3001:3000 diff --git a/writers/influxdb/README.md b/writers/influxdb/README.md index cd9180b6..6e92a29b 100644 --- a/writers/influxdb/README.md +++ b/writers/influxdb/README.md @@ -13,7 +13,6 @@ default values. | MF_NATS_URL | NATS instance URL | nats://localhost:4222 | | MF_INFLUX_WRITER_PORT | Service HTTP port | 8180 | | MF_INFLUX_WRITER_DB_NAME | InfluxDB database name | mainflux | -| MF_INFLUX_WRITER_DB_POINT | InfluxDB point to write data to | messages | | MF_INFLUX_WRITER_DB_HOST | InfluxDB host | localhost | | MF_INFLUX_WRITER_DB_PORT | Default port of InfluxDB database | 8086 | | MF_INFLUX_WRITER_DB_USER | Default user of InfluxDB database | mainflux | @@ -33,7 +32,6 @@ default values. MF_NATS_URL: [NATS instance URL] MF_INFLUX_WRITER_PORT: [Service HTTP port] MF_INFLUX_WRITER_DB_NAME: [InfluxDB database name] - MF_INFLUX_WRITER_DB_POINT: [point name] MF_INFLUX_WRITER_DB_HOST: [InfluxDB database host] MF_INFLUX_WRITER_DB_PORT: [InfluxDB port] MF_INFLUX_WRITER_DB_USER: [InfluxDB admin user] @@ -58,10 +56,23 @@ make influxdb make install # Set the environment variables and run the service -MF_NATS_URL=[NATS instance URL] MF_INFLUX_WRITER_PORT=[Service HTTP port] MF_INFLUX_WRITER_DB_NAME=[InfluxDB database name] MF_INFLUX_WRITER_DB_POINT=[point name] MF_INFLUX_WRITER_DB_HOST=[InfluxDB database host] MF_INFLUX_WRITER_DB_PORT=[InfluxDB port] MF_INFLUX_WRITER_DB_USER=[InfluxDB admin user] MF_INFLUX_WRITER_DB_PASS=[InfluxDB admin password] $GOBIN/mainflux-influxdb +MF_NATS_URL=[NATS instance URL] MF_INFLUX_WRITER_PORT=[Service HTTP port] MF_INFLUX_WRITER_DB_NAME=[InfluxDB database name] MF_INFLUX_WRITER_DB_HOST=[InfluxDB database host] MF_INFLUX_WRITER_DB_PORT=[InfluxDB port] MF_INFLUX_WRITER_DB_USER=[InfluxDB admin user] MF_INFLUX_WRITER_DB_PASS=[InfluxDB admin password] $GOBIN/mainflux-influxdb ``` +### Using docker-compose + +This service can be deployed using docker containers. +Docker compose file is available in /docker/addons/influxdb/docker-compose.yml. Besides database +and writer service, it contains [Grafana platform](https://grafana.com/) which can be used for database +exploration and data visualization and analytics. In order to run all Mainflux core services, as well as mentioned optional ones, execute following command: + +```bash +docker-compose -f docker/docker-compose.yml -f docker/addons/influxdb/docker-compose.yml up -d +``` + +_Please note that order matters here. You need to start core services before additional ones, i. e. core services compose file needs to be the first param of the command. Since all services need to be in the same network and writer services are dependent of core ones, you need to start all of them using single command._ + ## Usage Starting service will start consuming normalized messages in SenML format. diff --git a/writers/influxdb/influxdb.go b/writers/influxdb/influxdb.go index 3069cff7..671c24f1 100644 --- a/writers/influxdb/influxdb.go +++ b/writers/influxdb/influxdb.go @@ -10,20 +10,21 @@ import ( "github.com/mainflux/mainflux" ) +const pointName = "messages" + var _ writers.MessageRepository = (*influxRepo)(nil) type influxRepo struct { - database string - pointName string - client influxdata.Client + database string + client influxdata.Client } type fields map[string]interface{} type tags map[string]string // New returns new InfluxDB writer. -func New(client influxdata.Client, database, pointName string) (writers.MessageRepository, error) { - return &influxRepo{database, pointName, client}, nil +func New(client influxdata.Client, database string) (writers.MessageRepository, error) { + return &influxRepo{database, client}, nil } func (repo *influxRepo) Save(msg mainflux.Message) error { @@ -35,7 +36,7 @@ func (repo *influxRepo) Save(msg mainflux.Message) error { } tags, fields := repo.tagsOf(&msg), repo.fieldsOf(&msg) - pt, err := influxdata.NewPoint(repo.pointName, tags, fields, time.Now()) + pt, err := influxdata.NewPoint(pointName, tags, fields, time.Now()) if err != nil { return err } diff --git a/writers/influxdb/influxdb_test.go b/writers/influxdb/influxdb_test.go index 5081d6bc..3344feeb 100644 --- a/writers/influxdb/influxdb_test.go +++ b/writers/influxdb/influxdb_test.go @@ -64,7 +64,7 @@ func TestSave(t *testing.T) { client, err := influxdata.NewHTTPClient(clientCfg) assert.Nil(t, err, fmt.Sprintf("Creation of InfluxDB client expected to succeed.\n")) - repo, err := writer.New(client, testDB, "messages") + repo, err := writer.New(client, testDB) assert.Nil(t, err, fmt.Sprintf("InfluxDB repo creation expected to succeed.\n")) err = repo.Save(msg)