Code Monkey home page Code Monkey logo

lookerbot's Introduction

Lookerbot

Lookerbot integrates Slack and Looker to put all your data at your fingertips.

With Lookerbot, everyone in your company can easily share data and answer questions instantly. Lookerbot can answer questions, send alerts, and more!

For a free trial of Looker go to looker.com/free-trial.

Features

Detailed information on how to interact with Lookerbot can be found in the Looker Help Center.

Requirements

Deployment

Create a new bot in Slack

  1. Go to https://api.slack.com/apps?new_classic_app=1 and create a new Classic Slack App. Lookerbot uses the Real Time Messaging API so it must be a Classic Slack App. We call the app Looker but it's up to you.
  2. Click on the "OAuth and Permissions" tab and in the Scopes section add the following scopes using the "Add An OAuth Scope" button - don't click the green "Update Scopes" button, as this will convert the app to the new scopes workflow and will break your app! :
    1. channels:read
    2. chat:write:bot
    3. files:write:user
    4. team:read
    5. users:read
    6. commands (if you plan on configuring slash commands)
  3. Navigate to "App Home" and click "Add Legacy Bot User"
  4. At the top of the "OAuth & Permissions" page, click "Install App to Workspace."
  5. Click "Allow" to allow the Slack workspace to use the newly created app.
  6. At the top of the "OAuth & Permissions" page, copy the "Bot User OAuth Access Token" (you'll need this later). Note: bot token should start with xoxb-.
  7. Under "Basic Information", you can add an icon and description for Lookerbot. Here's the icon we use.

By default, Slack Apps are internal to your team. Don't "distribute" your Slack App – that will make it available to all Slack users in the world.

Important

Please note: some of the Environment Variables below have changed. You may need to adjust them in order to keep this working.

Heroku Deployment

Deploy

The quickest way to deploy the bot is to use Heroku's one-click deploy button, which will provision a server for your bot. This will prompt you to give the app a unique name, add the Slack API key and configure all of the required variables (see "Environment Variables" below).

Once the environment variables have been set and the server has been deployed, the bot should be ready to go! You can also optionally configure slash commands.

Troubleshooting

See dependency issues on heroku? Apply YARN_PRODUCTION=false as env. to the deployment. See heroku skip-pruning for more details.

Manual Deployment

The bot is a simple Node.js application. The application needs to be able to reach both your Looker instance's API and Slack's API. If you have a self-hosted instance of Looker, be sure to open up port 19999 (or your core_port) in order to accesss the Looker API.

Environment Variables

The bot is configured entirely via environment variables. You'll want to set up these variables:

  • SLACK_API_KEY (required) – This is where you'll put the "Bot User OAuth Access Token". You can get in the Slack app under "Install App".

  • LOOKER_URL (required) – The web url of your Looker instance.

  • LOOKER_API_BASE_URL (required) – The API endpoint of your Looker instance. In most cases, this will be the web url followed by :19999/api/4.0 (replace 19999 with your core_port if it is different).

  • LOOKER_API_CLIENT_ID (required) – The API client ID for the user you want the bot to run as. This requires creating an API user or an API key for an existing user in Looker.

  • LOOKER_API_CLIENT_SECRET (required) – The API client secret for the user you want the bot to run as. This requires creating an API user or an API key for an existing user in Looker.

  • LOOKER_CUSTOM_COMMAND_FOLDER_ID (optional) – The ID of a Folder that you would like the bot to use to define custom commands. Read about using custom commands in the Looker Help Center.

  • LOOKER_WEBHOOK_TOKEN (optional) – The webhook validation token found in Looker's admin panel. This is only required if you're using the bot to send scheduled webhooks.

  • SLACK_SLASH_COMMAND_TOKEN (optional) – If you want to use slash commands or interactive messages with Lookerbot, provide the verification token from the "Basic Information" section of the app settings. This is how the bot will verify the integrity of incoming slash commands.

  • PORT (optional) – The port that the bot web server will run on to accept slash commands. Defaults to 3333.

If you'd like to put these configuration variables on the filesystem instead, you can place them in a .env file at the root of the project as well. Environment variables will take precedence over .env settings if both are present.

Tweaking Behavior

There are a couple environment variables that can be used to tweak behavior:

  • LOOKER_SLACKBOT_LOADING_MESSAGES – Set this to false to disable posting loading messages.

  • LOOKERBOT_DATA_ACTIONS_IN_MESSAGES – Set this to false to disable making data action buttons available to Slack users.

(optional) Storage Services for Visualization Images
Amazon S3
  • SLACKBOT_S3_BUCKET (optional) – If you want to use Lookerbot to post visualization images, provide an Amazon S3 bucket name.

  • SLACKBOT_S3_BUCKET_REGION (optional) – If you want to use Lookerbot to post visualization images, provide an Amazon S3 bucket region. Defaults to us-east-1.

  • AWS_ACCESS_KEY_ID (optional) – If you want to use Lookerbot to post visualization images, provide an Amazon S3 access key that can write to the provided bucket.

  • AWS_SECRET_ACCESS_KEY (optional) – If you want to use Lookerbot to post visualization images, provide an Amazon S3 secret access key that can write to the provided bucket.

Microsoft Azure
  • AZURE_STORAGE_ACCOUNT (optional) - If you want to use Microsoft Azure Storage to store visualization images posted by Lookerbot, provide the name of your Azure Storage account.

  • SLACKBOT_AZURE_CONTAINER (optional) - If you want to use Microsoft Azure Storage to store visualization images posted by Lookerbot, provide the name of the container within your Azure Storage account that you wish to use.

  • AZURE_STORAGE_ACCESS_KEY (optional) - If using Microsoft Azure Storage to store visualization images posted by Lookerbot, provide an access key that can write to the provided Azure Storage account and container.

Google Cloud Storage
  • GOOGLE_CLOUD_BUCKET (optional) - If you want to use Google Cloud to store visualization images posted by Lookerbot, provide the name of your bucket.

If Lookerbot is running on Google Compute Engine, no further information should be needed if the approprate API scopes are set up.

Otherwise, you can provide credentials directly:

  • GOOGLE_CLOUD_PROJECT (optional) - If you want to use Google Cloud to store visualization images posted by Lookerbot, provide the name of your project.

  • GOOGLE_CLOUD_CREDENTIALS_JSON (optional) - If using Google Cloud to store visualization images posted by Lookerbot, provide the content of the credentials JSON file you got from the Google Cloud website.

Self-signed or invalid certificates

If your Looker instance uses a self-signed certificate, Lookerbot will refuse to connect to it by default.

Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to 0 will instruct Lookerbot to accept connections with invalid certificates. Please ensure you have thoroughly evaluated the security implications of this action for your infrastructure before setting this variable.

This should only impact on-premise deployments of Looker. Do not set this environment variable if Looker hosts your instance.

Connecting the bot to multiple Looker instances

If you would like the bot to connect to multiple instances of Looker, then you can configure the bot with the LOOKERS environment variable. This variable should be JSON array of JSON objects, each representing a Looker instance and its authentication information.

The JSON objects should have the following keys:

  • url should be the web url of the instance
  • apiBaseUrl should be the API endpoint
  • clientID should be the API client ID for the user you want the bot to run as
  • clientSecret should be the secret for that API key
  • customCommandFolderId is an optional parameter, representing a Folder that you would like the bot to use to define custom commands.
  • webhookToken is an optional parameter. It's the webhook validation token found in Looker's admin panel. This is only required if you're using the bot to send scheduled webhooks.

Here's an example JSON that connects to two Looker instances:

[{"url": "https://me.looker.com", "apiBaseUrl": "https://me.looker.com:19999/api/4.0", "clientId": "abcdefghjkl", "clientSecret": "abcdefghjkl"},{"url": "https://me-staging.looker.com", "apiBaseUrl": "https://me-staging.looker.com:19999/api/4.0", "clientId": "abcdefghjkl", "clientSecret": "abcdefghjkl"}]

The LOOKER_URL, LOOKER_API_BASE_URL, LOOKER_API_CLIENT_ID, LOOKER_API_CLIENT_SECRET, LOOKER_WEBHOOK_TOKEN, and LOOKER_CUSTOM_COMMAND_FOLDER_ID variables are ignored when LOOKERS is set.

Running the Server

To run the server:

  1. Ensure Node.js is installed
  2. yarn install to install dependencies
  3. yarn start to start the bot server. The server will run until you type Ctrl+C to stop it.

The included Procfile will also allow you to run the app using foreman or node-foreman. These libraries also provide easy ways of creating scripts for use with upstart, supervisord, and systemd.

Configuring Slash Commands

Slash commands are not required to interact with the bot. You can DM the bot directly or mention the bot like:

@looker help

and use all the functionality.

However, Slash commands are a bit friendlier to use and allow Slack to auto-complete so you'll probably want to set those up.

  1. Go to https://api.slack.com/apps and find your app.
  2. Choose "Slash Commands" and click "Create New Command".
  3. Create a command to use for the Looker bot. We use /looker but it's up to you.
  4. Set the URL to wherever you have your bot server hosted (if you used Heroku to set up the server, this will be the unique app name that you chose) . The path to the slash command endpoint is /slack/receive, so if your server is at https://example.com, the URL would be https://example.com/slack/receive.
  5. Under settings, choose "Install App" again, then "Reinstall App" and authenticate.
  6. Under "Basic Information", grab the verification token. You'll use this to set the SLACK_SLASH_COMMAND_TOKEN environment variable.

Scheduling Data to Slack

You can use the bot to send scheduled Looks to Slack.

  1. Click "Schedule" on a Look
  2. Set "Destination" to "Webhook"
  3. Leave "Format" set to default. The format selection is ignored.
  4. Enter the webhook URL of the server you set up.
  • Post to public channels /slack/post/channel/my-channel-name
    • (Lookerbot will need to be invited to this channel to post in it.)
  • Post to private groups /slack/post/group/my-channel-name
    • (Lookerbot will need to be invited to this group to post in it.)
  • To direct message a user /slack/post/dm/myusername

These URLs are prefixed with the URL of your server. (If you used the Heroku deployment, this will be the unique app name you chose). So, if your server is at https://example.com and you want to post to a channel called data-science, the URL would be https://example.com/slack/post/channel/data-science.

  1. You'll need to make sure that the LOOKER_WEBHOOK_TOKEN environment variable is properly set to the same verification token found in the Looker admin panel.

Data Actions

Performing Data Actions from Slack

By default, simple data actions will appear in Slack for single value visualizations. Data actions that have forms are not currently supported.

This can be disabled on a per-action basis by using Liquid templating in the action definition to restrict access to certain users. Alternately, the action buttons can be disabled entirely with the bot configuration variable LOOKERBOT_DATA_ACTIONS_IN_MESSAGES.

There's a quick additional configuration that's needed to use Data Actions from Slack:

  1. Go to https://api.slack.com/apps and find your app.
  2. Choose "Interactive Messages" and enable that feature.
  3. For the "Request URL", set the URL to wherever you have your bot server hosted (if you used Heroku to set up the server, this will be the unique app name that you chose). The path to for interactive message requests is /slack/action, so if your server is at https://example.com, the Request URL would be https://example.com/slack/action.
  4. Configure the Slash Command Token as described here.

Sending Slack Messages via Data Actions

The bot server also implements endpoints to allow you to easily send Data Actions to Slack.

Here's an example of a few data actions you could implement in your LookML. (Replace https://example.com with your bot's hostname.)

To make use of this, you'll need to make sure that the LOOKER_WEBHOOK_TOKEN environment variable is properly set to the same verification token found in the Looker admin panel, just like with scheduling data.

dimension: value {
  sql: CONCAT(${first_name}, ' ', ${last_name}) ;;

  # Let user choose a Slack channel to send to
  action: {
    label: "Send to Slack Channel"
    url: "https://example.com/data_actions"
    form_url: "https://example.com/data_actions/form"
    param: {
      name: "message"
      value: ":signal_strength: I sent a value from Slack: {{rendered_value}}"
    }
  }

  # Send to a particular Slack channel with a preset message
  action: {
    label: "Ping Channel"
    url: "https://example.com/data_actions"
    param: {
      name: "message"
      value: ":signal_strength: I sent a value from Slack: {{rendered_value}}"
    }
    param: {
      name: "channel"
      value: "#alerts"
    }
  }

  # Ask the user for a message to send to a particular channel
  action: {
    label: "Ask a Question"
    url: "https://example.com/data_actions"
    form_param: {
      name: "message"
      default: "Something seems wrong... (add details)"
    }
    param: {
      name: "channel"
      value: "#alerts"
    }
  }

}

Data Access

We suggest creating a Looker API user specifically for Lookerbot, and using that user's API credentials. It's worth remembering that everyone who can talk to your Lookerbot has the permissions of this user. If there's data you don't want people to access via Slack, ensure that user cannot access it using Looker's permissioning mechanisms.

Also, keep in mind that when the Looker bot answers questions in Slack the resulting data moves into Slack and is now hosted there. Be sure to carefully consider what data is allowed to leave Looker. Slack retains chat message history on their servers and pushes many types of notifications about messages out via other services.

To allow visualizations to appear in Slack, if configured to do so, the bot uploads them as images to Amazon S3 with an extremely long randomly-generated URL. Anyone with this URL can access that image at any time, though it should be extremely difficult to guess.

If you choose to remove the image files from S3, the Slack messages that relied on those images will be blank.

Running Locally for Development

  1. Install Node.js on your local machine.
  2. Install Yarn on your local machine.
  3. Add your environment variables to a file called .env at the base of the repo.
  4. Install dependencies with yarn install
  5. Run the bot with yarn start

Contributing

Pull Requests are welcome – we'd love to have help expanding the bot's functionality.

If you have any trouble with the bot, please open an issue so we can help you out!

lookerbot's People

Contributors

ajinkyan-goog avatar annguy3n avatar arkarkark avatar bmuller avatar christian-oudard avatar deanlooker avatar dependabot[bot] avatar djfarrelly avatar greg-finley avatar jmillergirvetz avatar kruncha avatar lameyer avatar morganatlooker avatar namabile avatar phillipperalez avatar rainiera avatar reedloden avatar ronnieplooker avatar rufusholmes avatar ryandunlavy avatar ryanj20021 avatar samjbobb avatar tomdev avatar wilg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lookerbot's Issues

Failed fetchAccessToken for Looker

I used Heroku's one-click deploy, but keep running into an issue with:

Failed fetchAccessToken for Looker https://looker.OURDOMAIN.com:19999/api/3.0: {"message":"Not found","documentation_url":"http://docs.looker.com/"}

When I go to just check the api location in Chrome just to verify it is running at all at https://looker.OURDOMAIN.com:19999/api/3.0, it returns: {"message":"Requires authentication.","documentation_url":"http://docs.looker.com/"}

Full heroku logs:

2016-04-22T07:17:55.878400+00:00 heroku[web.1]: Starting process with command `npm start`
2016-04-22T07:17:57.033028+00:00 heroku[web.1]: Process exited with status 143
2016-04-22T07:17:59.093671+00:00 app[web.1]: 
2016-04-22T07:17:59.093690+00:00 app[web.1]: > [email protected] start /app
2016-04-22T07:17:59.093692+00:00 app[web.1]: > coffee lib/bot.coffee
2016-04-22T07:17:59.093693+00:00 app[web.1]: 
2016-04-22T07:18:00.379655+00:00 heroku[web.1]: Restarting
2016-04-22T07:18:00.789530+00:00 app[web.1]: Using Looker information specified in individual environment variables.
2016-04-22T07:18:00.804735+00:00 app[web.1]: info: ** No persistent storage method specified! Data may be lost when process shuts down.
2016-04-22T07:18:00.838067+00:00 app[web.1]: info: ** Setting up custom handlers for processing Slack messages
2016-04-22T07:18:00.898122+00:00 app[web.1]: info: ** API CALL: https://slack.com/api/rtm.start
2016-04-22T07:18:00.900170+00:00 app[web.1]: info: ** API CALL: https://slack.com/api/team.info
2016-04-22T07:18:00.903467+00:00 app[web.1]: info: ** Starting webserver on port 23321
2016-04-22T07:18:00.903881+00:00 app[web.1]: info: ** Serving webhook endpoints for Slash commands and outgoing webhooks at: http://MY_HOST:23321/slack/receive
2016-04-22T07:18:01.007380+00:00 app[web.1]: info: Warning: using temporary storage. Data will be lost when process restarts.
2016-04-22T07:18:01.007533+00:00 app[web.1]: Saved the team information...
2016-04-22T07:18:01.040049+00:00 app[web.1]: Failed fetchAccessToken for Looker https://looker.OURDOMAIN.com:19999/api/3.0: {"message":"Not found","documentation_url":"http://docs.looker.com/"}
2016-04-22T07:18:01.040374+00:00 app[web.1]: Refreshing custom commands for https://looker.OURDOMAIN.com:9999...
2016-04-22T07:18:01.055996+00:00 app[web.1]: { error: 'Looker https://looker.OURDOMAIN.com:19999/api/3.0 not reachable.\n' }
2016-04-22T07:18:01.108704+00:00 app[web.1]: notice: ** BOT ID: looker ...attempting to connect to RTM!
2016-04-22T07:18:02.070933+00:00 heroku[web.1]: Starting process with command `npm start`
2016-04-22T07:18:04.131152+00:00 app[web.1]: 
2016-04-22T07:18:04.131166+00:00 app[web.1]: > [email protected] start /app
2016-04-22T07:18:04.131174+00:00 app[web.1]: > coffee lib/bot.coffee
2016-04-22T07:18:04.131192+00:00 app[web.1]: 
2016-04-22T07:18:04.507170+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-04-22T07:18:05.804246+00:00 app[web.1]: info: ** No persistent storage method specified! Data may be lost when process shuts down.
2016-04-22T07:18:05.841414+00:00 app[web.1]: info: ** Setting up custom handlers for processing Slack messages
2016-04-22T07:18:05.895250+00:00 app[web.1]: info: ** API CALL: https://slack.com/api/team.info
2016-04-22T07:18:05.897438+00:00 app[web.1]: info: ** Starting webserver on port 30563
2016-04-22T07:18:05.783272+00:00 app[web.1]: Using Looker information specified in individual environment variables.
2016-04-22T07:18:05.893543+00:00 app[web.1]: info: ** API CALL: https://slack.com/api/rtm.start
2016-04-22T07:18:05.989615+00:00 app[web.1]: info: Warning: using temporary storage. Data will be lost when process restarts.
2016-04-22T07:18:05.897698+00:00 app[web.1]: info: ** Serving webhook endpoints for Slash commands and outgoing webhooks at: http://MY_HOST:30563/slack/receive
2016-04-22T07:18:05.989718+00:00 app[web.1]: Saved the team information...
2016-04-22T07:18:06.016326+00:00 app[web.1]: Failed fetchAccessToken for Looker https://looker.OURDOMAIN.com:19999/api/3.0: {"message":"Not found","documentation_url":"http://docs.looker.com/"}
2016-04-22T07:18:06.016809+00:00 app[web.1]: Refreshing custom commands for https://looker.OURDOMAIN.com:9999...
2016-04-22T07:18:06.047157+00:00 app[web.1]: notice: ** BOT ID: looker ...attempting to connect to RTM!
2016-04-22T07:18:06.041416+00:00 app[web.1]: { error: 'Looker https://looker.OURDOMAIN.com:19999/api/3.0 not reachable.\n' }
2016-04-22T07:18:06.151577+00:00 heroku[web.1]: Process exited with status 143
2016-04-22T07:18:06.352191+00:00 heroku[web.1]: State changed from starting to up
2016-04-22T07:18:07.382864+00:00 heroku[router]: at=info method=POST path="/slack/receive" host=OURDOMAIN-looker.herokuapp.com request_id=9bb37feb-c451-4557-b865-8d535ed96dae fwd="52.91.184.228" dyno=web.1 connect=1ms service=30ms status=200 bytes=568
2016-04-22T07:18:07.380099+00:00 app[web.1]: Refreshing custom commands for https://looker.OURDOMAIN.com:9999...
2016-04-22T07:18:07.380368+00:00 app[web.1]: { error: 'Looker https://looker.OURDOMAIN.com:19999/api/3.0 not reachable.\n' }
2016-04-22T07:18:18.302498+00:00 heroku[router]: at=info method=POST path="/slack/receive" host=OURDOMAIN-looker.herokuapp.com request_id=879b258e-254a-4df3-9905-16794e4b7851 fwd="54.174.114.150" dyno=web.1 connect=1ms service=5ms status=200 bytes=568

Testing the auth in Looker API 3.0 Reference provides a 200 response, https://looker.OURDOMAIN.com:19999/api/3.0/login?client_id=SAMECLIENTIDHEROKUCONFIG&client_secret=SAMECLIENTSECRETHEROKUCONFIG

Click to deploy to (aws || azure)?

Can we do the same sort of thing with AWS and/or Azure with our partnership? I'm thinking of clients that might be purely one or the other, i.e. Jet.com

Support HTML formatting

It would be really cool if you could add the ability to pass the HTML defined in Looker through to Slack. This could have a ton of use cases but an example would be asking the looker bot for a list of orders in error and then our customer service team could click on the order link in slack and go directly to our order management system to view one of the orders that is in error.

Clarify S3 bucket naming scheme in Heroku form

Specifically on the section for the region of the s3 bucket, change the text to something like:
"The region of your s3 bucket. Make sure that you use the region name in the URL of your bucket rather than the display name. ie use us-west-2 rather than Oregon"

Javascript > CoffeeScript

I know - the title and the topic is incendiary and probably appears religious. However, I'd like to argue that choosing CoffeeScript for open projects for Looker as a product was a poor choice.

The number of repositories that Looker uses CoffeeScript for is just 1 (this one).
The number of repositories that Looker uses Javascript for is 25.

I've no doubt that there are many developers at Looker that enjoy the syntax of CoffeeScript, given the number of Looker projects that utilize Ruby. But on the flip side, if the goal was to release an open source project that can be used, debugged, and maintained by the NodeJS masses; choosing a niche/specialized syntax for this bot seems to miss the mark. I'd like to highlight a few reasons why I think that:

  • The number of developers that can contribute back to this project are limited to those who fully grok CoffeeScript. There are a bunch of issues in the queue and we've got a lot of very solid Javascript developers (dare I say all-stars?) that would love to help improve the bot.
  • We're fairly into Looker, and we haven't seen a single mention of CoffeeScript throughout the platform, including in the customizations that are possible - it's all about that vanilla Javascript.
  • CoffeeScript now has conflicting syntax with ES6
  • The project has seen ever-slowing development and has a veritable mountain of issues pending.
  • The CoffeeScript community is fractured
  • Node 4.6.2 (package.json currently lists 4.2.6 oddly enough, which is way out of LTS) supports a large chunk of ES6, and with v7 being the current stable version, and v4.x dropping LTS in April, an engine version bump supporting even more of ES6 would be justified, further negating the need for CoffeeScript.
  • CoffeeScript has virtually no upgrade path and a shrinking developer community behind it.
  • CoffeeScript doesn't get close to appearing on the latest top list of languages on Github and there are a bunch of other third-party resources would agree. (and Google Trends is just a beatdown)

I work for Gilt (now part of Hudson Bay Company) and we love Looker. We also love Node.js. We've been to the Looker conferences. I've partied on rooftops with you folks (JOIN 2016 wooo!). Our last CoffeeScript-literate developer split two years ago, and we've purged the last of the CoffeeScript in our ecosystem over a year ago. We just moved to slack, and would looooove to integrate the looker bot. We're sure there are a bunch of peeps using this bot and happy to do so without looking at or tinkering with the code, that's just not our style. CoffeeScript is an unfortunate deal-breaker.

If you'd like me to pull together some more resources and hard evidence, you need but ask. I'd be happy to do so to try and prove my case. I humbly propose using decaffeinate to bring this project into the future.

escape "\" command not executing properly

command = /looker am customer\, inc\.

Returns no results. When drilling into the link, the filter value is being populated with:

customer,inc\.

(missing the space after the comma, and not recognizing the second escape for the period).

Make it possible to use multiple filters on a dash

Currently, it is not possible to set up a custom command that takes two or more arguments, corresponding to two or more filters on the dashboard. It would be very helpful if this functionality was added.

For example, let's say I have a dashboard that tracks the number of new customers. Currently, I can add a date filter, and ping Lookerbot by saying /looker dashboard this month. However, I can't add another filter beyond the date. If I wanted to get all new customers this month who were larger than $1,000, I can't say /looker this month >1000.

Having the ability to pass multiple arguments into Lookerbot would be super helpful.

Support multiple filters

If a dashboard has a date filter, and you try to query using the looker filter expressions for dates, it returns an empty chart.

@looker dashboard123 5 days user123

looker response: (1kb blank chart)

Turn off preview when linking

It would be sweet if we could turn off the preview of data when we paste the lookerbot link. You can restrict the access lookerbot has for now but turning off the preview would be better.

Error: 413 "Payload Too Large" for Scheduled Webhook Payloads

Hey Looker-Slackbot team,

I've used the Heroku button deploy to launch slack bot (great experience!). I've gotten everything working however when I schedule a dashboard to be delivered to a lookerbots webhook endpoint for channels. I get an email error, Error: 413 "Payload Too Large instead of a slack post. Doing some digging it looks like maybe the default node body parser defaults may need to be changed (example).

Thanks!

Jesse

NodeJS not running

I'm attempting to setup the Looker-slackbot. I have an EC2 instance with nodeJS loaded and the require key values paris in the .env file at the root of the looker-slack repo.

When attempting to start nodeJS app I'm getting the following errors. Any help on this would be great.

[root@lookerbot-01 looker-slackbot]# nf start
[OKAY] Loaded ENV .env File as KEY=VALUE Format
[OKAY] Trimming display Output to 109 Columns

/usr/lib/node_modules/foreman/nf.js:100
      process.setuid(process.env.SUDO_USER);
              ^
TypeError: setuid argument must be a number or a string
    at Command.program.command.usage.option.description.action.command (/usr/lib/node_modules/foreman/nf.js:100:15)
    at Command.<anonymous> (/usr/lib/node_modules/foreman/node_modules/commander/index.js:249:8)
    at Command.emit (events.js:98:17)
    at Command.parseArgs (/usr/lib/node_modules/foreman/node_modules/commander/index.js:477:12)
    at Command.parse (/usr/lib/node_modules/foreman/node_modules/commander/index.js:370:21)
    at Object.<anonymous> (/usr/lib/node_modules/foreman/nf.js:280:9)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
[root@lookerbot-01 looker-slackbot]# 

improve documentation and README

Hi--

Really cool slackbot integration you guys have built, so thank you!

I was able to get it set up but there was a bunch of stuff that I think could have been clearer in the docs

  • The documentation was split up across the forum, the README, and the video. I think it would be helpful if the README contained more of the information. Even just the basics of how to create a command, it was not clear to me without a bunch of digging that a custom command was a look on a dashboard within a specific space set by an environment variable that I had already launched...
  • For a heroku deployment, docs seem out of order. If you actually follow the order of the instructions on the docs, you'll get errors, just because of when URLs are generated etc
  • The readme documentation for creating a bot user is incorrect if your slack organization does not have any existing bot users. The menu path you write on the readme actually didn't exist for me. I had to go create a bot through a different pathway.
  • To make the docs and setup a bit more foolproof, you may want to include a bit more info on s3 bucket setup. It's not too complicated but by centralizing this all in the documentation you make it easier to set up. The reason it could be worthwhile is there are still several steps, setting up the s3 bucket, provisioning the new user, writing their policy for permissions... easy to mess up at several steps along the way. You could just write a section on the s3 bucket in a couple of paragraphs and people could skip if they know how
  • Include a link to the marketing video on the readme
  • Change outline of README headers-- the info for setting up your own server is sprinkled around other different comments around data access, slash commands etc.
  • Still unsure right now about how you set up filters through commands to the bot (I'll figure it out soon, but this could be explained in the docs and save some time!)

Thank you for the cool tool!

Setting up a command is inelegant

It would be great if we could issue commands directly to looks instead of adding looks to dashboards and then connecting a slack command with a dashboard.

Unclear how to debug when scheduled Look is not accessible to bot user

Hi @wilg! I tried setting up Scheduled Looks to go Slack, but seems to have hit a snag without being able to proceed.

I'm pretty sure that I've set up the LOOKER_WEBHOOK_TOKEN correctly, but when I send a test request to the webhook, no message shows up.

I also tried testing by capturing the Looker webhook with my own handler and then mimicking the request with curl, and I get the following response:

{"success":true,"reason":"Sending Look 3513 to channel #data-analytics."}

But no message in Slack. Not sure how to debug further?

Looker bot not returning slack command with escaped ampersand, &

Problem
Lookerbot is unable to return Slack commands containing ampersand &

Repro

_equals

_contains

The link to Looker explore and filters within the explore work whether the ampersand is encoded or not.

The following escapes with and without spaces and double quotes surrounding them have been tried:

"&"
%26
^&
&amp;
\&
&\
_&
/&

Suggest Including S3 Bucket Policy Requirements

Took me quite a bit of tinkering to figure out the correct policies for the S3 Bucket User. I might even be over granting still. The biggest hang up I was having was PutObectAcl. The errors messages didn't really describe what was missing, so I had to tinker around and check the code. Also might want to mention that you have to turn Static Website hosting on. (common sense, but it could help somebody.)

Here is my current policy, but I think it might more permissive than needed.

"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectVersion"
],

CoffeeScript must be installed globally

Error report attached as below:

0 info it worked if it ends with ok
1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ]
2 info using [email protected]
3 info using [email protected]
4 verbose run-script [ 'prestart', 'start', 'poststart' ]
5 info lifecycle [email protected]prestart: [email protected]
6 silly lifecycle [email protected]
prestart: no script for prestart, continuing
7 info lifecycle [email protected]start: [email protected]
8 verbose lifecycle [email protected]
start: unsafe-perm in lifecycle true
9 verbose lifecycle [email protected]start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/Alex/Develop/src/github.com/alexbao/looker-slackbot/node_modules/.bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/Alex/Develop/bin:/usr/local/opt/go/libexec/bin:/Users/Alex/Develop/tools:/Users/Alex/Develop/src/github.com/goforward/infrastructure/scripts
10 verbose lifecycle [email protected]
start: CWD: /Users/Alex/Develop/src/github.com/alexbao/looker-slackbot
11 silly lifecycle [email protected]start: Args: [ '-c', 'coffee lib/bot.coffee' ]
12 silly lifecycle [email protected]
start: Returned: code: 1 signal: null
13 info lifecycle [email protected]~start: Failed to exec start script
14 verbose stack Error: [email protected] start: coffee lib/bot.coffee
14 verbose stack Exit status 1
14 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:279:16)
14 verbose stack at emitTwo (events.js:106:13)
14 verbose stack at EventEmitter.emit (events.js:191:7)
14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14)
14 verbose stack at emitTwo (events.js:106:13)
14 verbose stack at ChildProcess.emit (events.js:191:7)
14 verbose stack at maybeClose (internal/child_process.js:877:16)
14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
15 verbose pkgid [email protected]
16 verbose cwd /Users/Alex/Develop/src/github.com/alexbao/looker-slackbot
17 error Darwin 15.6.0
18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "start"
19 error node v6.10.0
20 error npm v4.3.0
21 error code ELIFECYCLE
22 error errno 1
23 error [email protected] start: coffee lib/bot.coffee
23 error Exit status 1
24 error Failed at the [email protected] start script 'coffee lib/bot.coffee'.
24 error Make sure you have the latest version of node.js and npm installed.
24 error If you do, this is most likely a problem with the looker-slackbot package,
24 error not with npm itself.
24 error Tell the author that this fails on your system:
24 error coffee lib/bot.coffee
24 error You can get information on how to open an issue for this project with:
24 error npm bugs looker-slackbot
24 error Or if that isn't available, you can get their info via:
24 error npm owner ls looker-slackbot
24 error There is likely additional logging output above.
25 verbose exit [ 1, true ]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.