Mnemosyne is an open-source self-hosted session management service. It's written in Go, making it easy to build and deploy as a static binary.
It provides gRPC interface. Messages are encoded using protobuf.
To install and run service:
$ go get -d github.com/piotrkowalczuk/mnemosyne/...
$ cd $GOPATH/src/github.com/piotrkowalczuk/mnemosyne
$ make
$ mnemosyned -log.environment=development -postgres.address='postgres://localhost/example?sslmode=disable'Goal is to support multiple storage's, like PostgreSQL, Redis or MongoDB. Nevertheless currently supported is only PostgreSQL.
For communication, Mnemosyne is exposing RPC API that uses protocol buffers, Google’s mature open source mechanism for serializing structured data.
- Create
- Get
- List
- Exists
- Abandon
- SetData
- Delete
Mnemosyne can be installed in one way, from source.
Or can be used as a container using docker image.
It is worth to mention that latest tag is released after each successful master branch build. Please use only images tagged using specific version anywhere else than a local development environment.
To install from source both go tools and dep is required.
$ go get -d github.com/piotrkowalczuk/mnemosyne/...
$ cd $GOPATH/src/github.com/piotrkowalczuk/mnemosyne
$ make
mnemosyned accepts command line arguments to control its behavior.
Possible options are listed below.
| Name | Flag | Default | Type |
|---|---|---|---|
| host | -host |
127.0.0.1 | string |
| port | -port |
8080 | int |
| grpc debug mode | -grpc.debug |
false | boolean |
| cluster listen address | -cluster.listen |
string | |
| cluster seeds | -cluster.seeds |
string | |
| time to live | -ttl |
24m | duration |
| time to clear | -ttc |
1m | duration |
| logger environment | -log.environment |
production | enum(development, production, stackdriver) |
| logger level | -log.level |
info | enum(debug, info, warn, error, dpanic, panic, fatal) |
| storage | -storage |
postgres | enum(postgres) |
| postgres address | -postgres.address |
postgres://postgres:postgres@postgres/postgres?sslmode=disable | string |
| postgres table | -postgres.table |
session | string |
| postgres schema | -postgres.schema |
mnemosyne | string |
| tls | -tls |
false | boolean |
| tls certificate file | -tls.crt |
string | |
| tls key file | -tls.key |
string |
As we know, mnemosyne can be configured in many ways. For the beginning we can start simple:
$ mnemosyned postgres.address="postgres://localhost/test?sslmode=disable"Mnemosyne will automatically create all required tables/indexes for specified database.
mnemosyned works well with Prometheus.
It exposes multiple metrics through /metrics endpoint, it includes:
mnemosyned_cache_hits_totalmnemosyned_cache_misses_totalmnemosyned_cache_refresh_totalmnemosyned_storage_postgres_errors_totalmnemosyned_storage_postgres_queries_totalmnemosyned_storage_postgres_query_duration_secondsmnemosyned_storage_postgres_connections
Additionally to that mnemosyned is using internally promgrpc package to monitor entire incoming and outgoing RPC traffic.
package main
import (
"fmt"
"golang.org/x/net/context"
"github.com/piotrkowalczuk/mnemosyne"
)
func main() {
mnemo, err := mnemosyne.New(mnemosyne.MnemosyneOpts{
Addresses: []string{"127.0.0.1:8080"},
Block: true,
})
if err != nil {
// ...
}
defer mnemo.Close()
ses, err := mnemo.Start(context.Background(), "subject-id", "subject-client", map[string]string{
"username": "[email protected]",
"first_name": "John",
"last_name": "Snow",
})
if err != nil {
// ...
}
fmt.Println(ses.AccessToken)
}Library is available through pypi and can be installed by typing pip install mnemosyne-client.
from mnemosynerpc import session_pb2, session_pb2_grpc
import grpc
channel = grpc.insecure_channel('localhost:8080')
stub = session_pb2_grpc.SessionManagerStub(channel)
for i in range(0, 10):
res = stub.Start(session_pb2.StartRequest(session=session_pb2.Session(subject_id=str(i))))
res = stub.Get(session_pb2.GetRequest(access_token=res.session.access_token))
print "%s - %s" % (res.session.access_token, res.session.expire_at.ToJsonString())TODO: describe