Ryan McKinley 81ff856568 grafana-cli: allow installing plugins from a local zip file (#18021) %!s(int64=6) %!d(string=hai) anos
..
api 78ca55f3d7 Fix: Break redirect loop if oauth_auto_login = true and OAuth login fails (#17974) %!s(int64=6) %!d(string=hai) anos
bus 87760d4fde Codestyle: Fix govet issues (#17178) %!s(int64=6) %!d(string=hai) anos
cmd 81ff856568 grafana-cli: allow installing plugins from a local zip file (#18021) %!s(int64=6) %!d(string=hai) anos
components caa1314f44 Build: use golangci-lint as a make command (#17739) %!s(int64=6) %!d(string=hai) anos
events de0f04ec3c feat(signup): progress on new sign up and email verification flow, #2353 %!s(int64=10) %!d(string=hai) anos
extensions e6b8a1529b SAML: Configuration defaults, examples and dependencies (#17954) %!s(int64=6) %!d(string=hai) anos
infra 0adbb001db RemoteCache: redis connection string parsing test (#17702) %!s(int64=6) %!d(string=hai) anos
login e2cf7c9698 LDAP: finishing touches (#17945) %!s(int64=6) %!d(string=hai) anos
middleware 332920954e SAML: Show SAML login button even if OAuth is disabled (#17993) %!s(int64=6) %!d(string=hai) anos
models e574147b1e Auth: SAML login button. (#17932) %!s(int64=6) %!d(string=hai) anos
plugins fb39831df2 Explore: Queries the datasource once per run query and uses DataStreamObserver (#17263) %!s(int64=6) %!d(string=hai) anos
registry d0c00388e6 add functionality to override service in registry %!s(int64=7) %!d(string=hai) anos
services 25506829be LDAP: Adds back support for single bind. (#17999) %!s(int64=6) %!d(string=hai) anos
setting b67905a963 Auth: saml enabled check. (#17960) %!s(int64=6) %!d(string=hai) anos
tsdb 7e95ded164 AzureMonitor: remove duplicate query logic on the frontend (#17198) %!s(int64=6) %!d(string=hai) anos
util 151b24b95f CLI: Add command to migrate all datasources to use encrypted password fields (#17118) %!s(int64=6) %!d(string=hai) anos
ARCHITECTURE.md 2ae6adef26 Codestyle: add guidelines for removing the m alias for models (#17890) %!s(int64=6) %!d(string=hai) anos
README.md 8f150c67aa Docs upgrading deps (#17657) %!s(int64=6) %!d(string=hai) anos
STYLEGUIDE.md caa1314f44 Build: use golangci-lint as a make command (#17739) %!s(int64=6) %!d(string=hai) anos

README.md

Grafana backend codebase

The code styleguide and brief description of the architecture

On going refactorings.

These issues are not something we want to address all at once but something we will improve over time. Since Grafana is released at a regular schedule the prefer approuch is to do this in batches. Not only is it easier to review, it also reduces the risk of conflicts when cherry-picking fixes from master to release branches. Changes that spawn multiple locations are therefore prefered in the end of the release cycle since we make fewer patch releases in the end of the cycle.

Global state

Global state makes testing and debugging software harder and its something we want to avoid when possible. Unfortunately, there is quite a lot of global state in Grafana. The way we want to migrate away from this is to use the inject package to wire up all dependencies either in pkg/cmd/grafana-server/main.go or self registering using registry.RegisterService ex https://github.com/grafana/grafana/blob/master/pkg/services/cleanup/cleanup.go#L25

Reduce the use of the init() function

Should only be used to register services/implementations.

Settings refactoring

The plan is to move all settings to from package level vars in settings package to the setting.Cfg struct. To access the settings services/components can inject this setting.Cfg struct.

Cfg struct Injection example

Reduce the use of Goconvey

We want to migrated away from using Goconvey and use stdlib testing as its the most common approuch in the GO community and we think it will make it easier for new contributors. Read more about how we want to write tests in the ARCHITECTURE.MD docs.

Sqlstore refactoring

The sqlstore handlers all use a global xorm engine variable. This should be refactored to use the Sqlstore instance.

Avoid global HTTP Handler functions

HTTP handlers should be refactored to so the handler methods are on the HttpServer instance or a more detailed handler struct. E.g (AuthHandler). This way they get access to HttpServer service dependencies (& Cfg object) and can avoid global state

Date comparison

Newly introduced date columns in the database should be stored as epochs if date comparison is required. This permits to have a unifed approach for comparing dates against all the supported databases instead of handling seperately each one of them. In addition to this, by comparing epochs error pruning transformations from/to other time zones are no more needed.

Dependency management

Documented in UPDRAGING_DEPENDENCIES.md.