No Description

Andrew d1fdcd0f6c Better readme 9 years ago
app c36e1da4ff Merged dashboards 9 years ago
config 0a4dcfa10f Working dashboards 9 years ago
lib 9ee85f535b Moved blazer checks below dashboards 9 years ago
.gitignore febad48ae1 First commit 10 years ago
CHANGELOG.md b157247df0 Updated readme 9 years ago
Gemfile 63cebd9333 Fixed style 10 years ago
LICENSE.txt febad48ae1 First commit 10 years ago
README.md d1fdcd0f6c Better readme 9 years ago
Rakefile 63cebd9333 Fixed style 10 years ago
blazer.gemspec 63cebd9333 Fixed style 10 years ago

README.md

Blazer

Share data effortlessly with your team

Blazer eliminates the need for many admin pages

Play around with the demo - data from MovieLens

Screenshot

Works with PostgreSQL, MySQL, and Redshift

:tangerine: Battle-tested at Instacart

Features

  • Secure - works with your authentication system
  • Variables - run the same queries with different values
  • Linked Columns - link to other pages in your apps or around the web
  • Smart Columns - get the data you want without all the joins
  • Smart Variables - no need to remember ids
  • Charts - visualize the data
  • Audits - all queries are tracked
  • Checks & Alerts - get emailed when bad data appears [master]

Installation

Add this line to your application’s Gemfile:

gem 'blazer'

Run:

rails g blazer:install
rake db:migrate

And mount the dashboard in your config/routes.rb:

mount Blazer::Engine, at: "blazer"

For production, specify your database:

ENV["BLAZER_DATABASE_URL"] = "postgres://user:password@hostname:5432/database_name"

Blazer tries to protect against queries which modify data (by running each query in a transaction and rolling it back), but a safer approach is to use a read only user. Keep reading to see how to create one.

Permissions

PostgreSQL

Create a user with read only permissions:

BEGIN;
CREATE ROLE blazer LOGIN PASSWORD 'secret123';
GRANT CONNECT ON DATABASE database_name TO blazer;
GRANT USAGE ON SCHEMA public TO blazer;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO blazer;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO blazer;
COMMIT;

MySQL

Create a user with read only permissions:

GRANT SELECT, SHOW VIEW ON database_name.* TO blazer@’127.0.0.1′ IDENTIFIED BY ‘secret123‘;
FLUSH PRIVILEGES;

Authentication

Don’t forget to protect the dashboard in production.

Basic Authentication

Set the following variables in your environment or an initializer.

ENV["BLAZER_USERNAME"] = "andrew"
ENV["BLAZER_PASSWORD"] = "secret"

Devise

authenticate :user, lambda { |user| user.admin? } do
  mount Blazer::Engine, at: "blazer"
end

Variables

Create queries with variables

SELECT COUNT(*) FROM users WHERE gender = {gender}

Smart Variables

[demo]

Supposed you have this query

SELECT COUNT(*) FROM users WHERE city_id = {city_id}

Instead of remembering each city’s id, users can select cities by name.

Add a smart variable with:

smart_variables:
  city_id: "SELECT id, name FROM cities ORDER BY name ASC"

The first column is the value of the variable, and the second column is the label.

Results

Linked Columns

[demo]

Link results to other pages in your apps or around the web. Specify a column name and where it should link to. You can use the value of the result with {value}.

linked_columns:
  user_id: "/admin/users/{value}"
  ip_address: "http://www.infosniper.net/index.php?ip_address={value}"

Smart Columns

[demo]

SELECT name, city_id FROM users

See which city the user belongs to without a join.

smart_columns:
  city_id: "SELECT id, name FROM cities WHERE id IN {value}"

Charts

Blazer will automatically generate charts based on the types of the columns returned in your query.

Line Chart

There are two ways to generate line charts.

2+ columns - timestamp, numeric(s) [demo]

SELECT gd_week(created_at), COUNT(*) FROM users GROUP BY 1

3 columns - timestamp, string, numeric [demo]

SELECT gd_week(created_at), gender, AVG(age) FROM users GROUP BY 1, 2

Pie Chart

2 columns - string, numeric [demo]

SELECT gender, COUNT(*) FROM users GROUP BY 1

Audits

Each query run creates a Blazer::Audit.

Dashboards [unreleased]

[demo]

Combine multiple queries into a dashboard.

If the query has a chart, the chart is shown. Otherwise, you’ll see a table.

If any queries have variables, they will show up on the dashboard.

Checks [unreleased]

[demo]

Checks give you a centralized place to see the health of your data.

Create a query to identify bad rows.

SELECT * FROM events WHERE started_at > ended_at

Then create check with optional emails if you want to be notified. Set up checks to run every hour.

rake blazer:run_checks

When a check changes state, users are emailed.

Be sure to set a host in config/environments/production.rb for emails to work.

config.action_mailer.default_url_options = {host: "blazerme.herokuapp.com"}

You can also set up failing checks to be sent once a day (or whatever you prefer).

Set up a cron job to run:

rake blazer:send_failing_checks

Customization

Change time zone

Blazer.time_zone = "Pacific Time (US & Canada)"

Change timeout PostgreSQL only

Blazer.timeout = 10 # defaults to 15

Turn off audits

Blazer.audit = false

Custom user class

Blazer.user_class = "Admin"

Customize user name

Blazer.user_name = :first_name

Security Considerations

Protect senstive information with views.

Useful Tools

For an easy way to group by day, week, month, and more with correct time zones, check out Groupdate.

Redshift

Add activerecord4-redshift-adapter to your Gemfile and set BLAZER_DATABASE_URL to redshift://user:pass@host:5439/db.

Upgrading

1.0.0 [unreleased]

Add a migration for dashboards and checks

rails g migration create_blazer_dashboards

with

create_table :blazer_dashboards do |t|
  t.text :name
  t.timestamps
end

create_table :blazer_dashboard_queries do |t|
  t.references :blazer_dashboard
  t.references :blazer_query
  t.integer :position
  t.timestamps
end

create_table :blazer_checks do |t|
  t.references :blazer_query
  t.string :state
  t.text :emails
  t.timestamps
end

TODO

  • better readme
  • better navigation
  • standalone version
  • update lock
  • warn when database user has write permissions
  • advanced permissions
  • maps
  • favorites
  • support for multiple data sources

History

View the changelog

Thanks

Blazer uses a number of awesome, open source projects.

Created by ankane and righi

Contributing

Everyone is encouraged to help improve this project. Here are a few ways you can help: