Commit 785f35b1 by Torkel Ödegaard

Merge branch 'master' of github.com:grafana/grafana

parents c67327d7 a6c438c8
......@@ -5,5 +5,5 @@
# root_url = %(protocol)s://%(domain)s:10081/grafana/
apacheproxy:
build: blocks/apache_proxy
build: docker/blocks/apache_proxy
network_mode: host
collectd:
build: blocks/collectd
build: docker/blocks/collectd
environment:
HOST_NAME: myserver
GRAPHITE_HOST: graphite
......
graphite09:
build: blocks/graphite
build: docker/blocks/graphite
ports:
- "8080:80"
- "2003:2003"
......
graphite:
build:
context: blocks/graphite1
context: docker/blocks/graphite1
args:
version: master
ports:
......
mssql:
build:
context: blocks/mssql/build
context: docker/blocks/mssql/build
environment:
ACCEPT_EULA: Y
MSSQL_SA_PASSWORD: Password!
......
mssqltests:
build:
context: blocks/mssql/build
context: docker/blocks/mssql/build
environment:
ACCEPT_EULA: Y
MSSQL_SA_PASSWORD: Password!
......
mysql_opendata:
build: blocks/mysql_opendata
build: docker/blocks/mysql_opendata
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: testdata
......
mysqltests:
build:
context: blocks/mysql_tests
context: docker/blocks/mysql_tests
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: grafana_tests
......
......@@ -5,5 +5,5 @@
# root_url = %(protocol)s://%(domain)s:10080/grafana/
nginxproxy:
build: blocks/nginx_proxy
build: docker/blocks/nginx_proxy
network_mode: host
openldap:
build: blocks/openldap
build: docker/blocks/openldap
environment:
SLAPD_PASSWORD: grafana
SLAPD_DOMAIN: grafana.org
......
postgrestest:
build:
context: blocks/postgres_tests
context: docker/blocks/postgres_tests
environment:
POSTGRES_USER: grafanatest
POSTGRES_PASSWORD: grafanatest
......
prometheus:
build: blocks/prometheus
build: docker/blocks/prometheus
network_mode: host
ports:
- "9090:9090"
......@@ -25,7 +25,7 @@
- "9093:9093"
prometheus-random-data:
build: blocks/prometheus_random_data
build: docker/blocks/prometheus_random_data
network_mode: host
ports:
- "8081:8080"
prometheus:
build: blocks/prometheus2
build: docker/blocks/prometheus2
network_mode: host
ports:
- "9090:9090"
......@@ -25,7 +25,7 @@
- "9093:9093"
prometheus-random-data:
build: blocks/prometheus_random_data
build: docker/blocks/prometheus_random_data
network_mode: host
ports:
- "8081:8080"
prometheus:
build: blocks/prometheus_mac
build: docker/blocks/prometheus_mac
ports:
- "9090:9090"
......@@ -21,6 +21,6 @@
- "9093:9093"
prometheus-random-data:
build: blocks/prometheus_random_data
build: docker/blocks/prometheus_random_data
ports:
- "8081:8080"
......@@ -32,11 +32,11 @@ permissions and org memberships.
## Grafana Auth
Grafana of course has a built in user authentication system with password authenticaten enabled by default. You can
Grafana of course has a built in user authentication system with password authentication enabled by default. You can
disable authentication by enabling anonymous access. You can also hide login form and only allow login through an auth
provider (listed above). There is also options for allowing self sign up.
### Anonymous authenticaten
### Anonymous authentication
You can make Grafana accessible without any login required by enabling anonymous access in the configuration file.
......@@ -84,4 +84,3 @@ Set to the option detailed below to true to hide sign-out menu link. Useful if y
[auth]
disable_signout_menu = true
```
......@@ -5,7 +5,9 @@ const LegendItem = ({ series }) => (
<div className="graph-legend-icon">
<i className="fa fa-minus pointer" style={{ color: series.color }} />
</div>
<a className="graph-legend-alias pointer">{series.alias}</a>
<a className="graph-legend-alias pointer" title={series.alias}>
{series.alias}
</a>
</div>
);
......
......@@ -255,6 +255,8 @@ class PromQueryField extends React.Component<PromQueryFieldProps, PromQueryField
// Keep this DOM-free for testing
getTypeahead({ prefix, wrapperClasses, text }: PromTypeaheadInput): TypeaheadOutput {
// Syntax spans have 3 classes by default. More indicate a recognized token
const tokenRecognized = wrapperClasses.length > 3;
// Determine candidates by CSS context
if (_.includes(wrapperClasses, 'context-range')) {
// Suggestions for metric[|]
......@@ -266,7 +268,7 @@ class PromQueryField extends React.Component<PromQueryFieldProps, PromQueryField
return this.getAggregationTypeahead.apply(this, arguments);
} else if (
// Non-empty but not inside known token
(prefix && !_.includes(wrapperClasses, 'token')) ||
(prefix && !tokenRecognized) ||
(prefix === '' && !text.match(/^[)\s]+$/)) || // Empty context or after ')'
text.match(/[+\-*/^%]/) // After binary operator
) {
......
......@@ -53,4 +53,22 @@ describe('braces', () => {
handler(event, change);
expect(Plain.serialize(change.value)).toEqual('sum(rate(metric{namespace="dev", cluster="c1"}[2m]))');
});
it('removes closing brace when opening brace is removed', () => {
const change = Plain.deserialize('time()').change();
let event;
change.move(5);
event = new window.KeyboardEvent('keydown', { key: 'Backspace' });
handler(event, change);
expect(Plain.serialize(change.value)).toEqual('time');
});
it('keeps closing brace when opening brace is removed and inner values exist', () => {
const change = Plain.deserialize('time(value)').change();
let event;
change.move(5);
event = new window.KeyboardEvent('keydown', { key: 'Backspace' });
const handled = handler(event, change);
expect(handled).toBeFalsy();
});
});
......@@ -43,6 +43,22 @@ export default function BracesPlugin() {
return true;
}
case 'Backspace': {
const text = value.anchorText.text;
const offset = value.anchorOffset;
const previousChar = text[offset - 1];
const nextChar = text[offset];
if (BRACES[previousChar] && BRACES[previousChar] === nextChar) {
event.preventDefault();
// Remove closing brace if directly following
change
.deleteBackward()
.deleteForward()
.focus();
return true;
}
}
default: {
break;
}
......
......@@ -46,7 +46,7 @@ export function determineQueryHints(series: any[], datasource?: any): any[] {
// Check for monotony
const datapoints: number[][] = s.datapoints;
if (datapoints.length > 1) {
if (query.indexOf('rate(') === -1 && datapoints.length > 1) {
let increasing = false;
const monotonic = datapoints.filter(dp => dp[0] !== null).every((dp, index) => {
if (index === 0) {
......
......@@ -247,6 +247,12 @@ describe('PrometheusDatasource', () => {
});
});
it('returns no rate hint for a monotonously increasing series that already has a rate', () => {
const series = [{ datapoints: [[23, 1000], [24, 1001]], query: 'rate(metric[1m])', responseIndex: 0 }];
const hints = determineQueryHints(series);
expect(hints).toEqual([null]);
});
it('returns a rate hint w/o action for a complex monotonously increasing series', () => {
const series = [{ datapoints: [[23, 1000], [24, 1001]], query: 'sum(metric)', responseIndex: 0 }];
const hints = determineQueryHints(series);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment