Giter VIP home page Giter VIP logo

dispatch's Introduction

About

What's Dispatch?

Put simply, Dispatch is:

All of the ad-hoc things you’re doing to manage incidents today, done for you, and a bunch of other things you should've been doing, but have not had the time!

Dispatch helps us effectively manage security incidents by deeply integrating with existing tools used throughout an organization (Slack, GSuite, Jira, etc.,) Dispatch is able to leverage the existing familiarity of these tools to provide orchestration instead of introducing another tool.

This means you can let Dispatch focus on creating resources, assembling participants, sending out notifications, tracking tasks, and assisting with post-incident reviews; allowing you to focus on actually fixing the issue!

Project resources

dispatch's People

Contributors

abdullahselek avatar bsundsrud avatar caioaao avatar cinojose avatar daniel-gallagher avatar dependabot[bot] avatar diogomatsubara avatar filippog avatar forestmonster avatar jneelamekam avatar jschroth avatar jtorvald avatar kaelwd avatar kevgliss avatar kishore-jalleda avatar meandmybadself avatar metroid-samus avatar milavent avatar mnuck avatar mvilanova avatar patcable avatar purplestarchild avatar stefanm8 avatar thedahv avatar vindex10 avatar whitdog47 avatar willbengtson avatar wssheldon avatar ymatsiuk avatar zetxek 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dispatch's Issues

Advice for adding new features

Hi there,

Our team is currently reviewing incident command tools to replace our in house built one. We'd like to empower teams throughout our organisation to create and run incidents themselves. I was hoping that you could help me understand what would be involved in us adding the following features, and whether we could use the current plugin system for it?

  1. Our organisation uses slack heavily - we'd like to be able to create incidents within slack rather than a separate UI
  2. We need a tool that's easy for infrequent users to use - we'd like to use slack UIs and buttons rather than slash commands for initiating most of the interactions
  3. We use Zoom for our calls - we'd like to create a single official zoom meeting for every incident
  4. Our organisation spans multiple timezones and it can get confusing if we're not explicit - we'd like to use a hard-coded timezone everywhere it's mentioned in the UI or allow for entering in local time and convert to a hard-coded timezone
  5. Some of our incidents are ongoing for a while before they're reported - we'd like to separate the start time and reported time for incidents.

Thanks a lot,

Laurence

Docs for the dashboard UI URL location

I've started trying out Dispatch locally and kicking the tyres. I struggled to find the dashboard, the root URL takes you to the incident report.

I have managed to find its at /dashboard by looking in the source code.
It would be good if this could be signposted in the docs.

Problems with create Tag

Hello!
I have problems with create tags.

When i run all containers via docker-compose.
I run those commands:
dispatch database init
dispatch database upgrade
dispatch database restore --dump-file /dispatch-sample-data.dump

After those I cannot add some tags in UI
image
In logs I see this
image
How I can resolve this?

docker-entrypoint.sh issue

Any idea why this is happening after I do docker run:

/etc/dispatch/docker-entrypoint.sh: line 12: syntax error near unexpected token `start'

I set the chmod u+x, but I do not see the problem in the script.

chmod u+x docker-entrypoint.sh && dependency

root@917329a03ed4:/etc/dispatch# ./docker-entrypoint.sh server start
bash: ./docker-entrypoint.sh: Permission denied
root@917329a03ed4:/etc/dispatch# chmod u+x docker-entrypoint.sh
root@917329a03ed4:/etc/dispatch# ./docker-entrypoint.sh
root@917329a03ed4:/etc/dispatch# ./docker-entrypoint.sh server start
./docker-entrypoint.sh: line 17: exec: server: not found
root@917329a03ed4:/etc/dispatch# ./docker-entrypoint.sh "server start"
Traceback (most recent call last):
  File "/usr/local/bin/dispatch", line 5, in <module>
    from dispatch.cli import entrypoint
  File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 13, in <module>
    from dispatch.application.models import *  # noqa
  File "/usr/local/lib/python3.8/site-packages/dispatch/application/models.py", line 9, in <module>
    from dispatch.models import DispatchBase, applications_incidents, TimeStampMixin
  File "/usr/local/lib/python3.8/site-packages/dispatch/models.py", line 181, in <module>
    from dispatch.status_report.models import *  # noqa
ModuleNotFoundError: No module named 'dispatch.status_report'
root@917329a03ed4:/etc/dispatch#

After having built the image with docker build . -t dispatch-local

And running it with docker run -ti --entrypoint=bash dispatch-local

ERROR: Error loading ASGI app. Could not import module "main"

Hello,

I managed to go through the whole docker-dispatch/install.sh installation script, but I have the following issue when starting the containers:

Error: Missing argument "APP".

I tried to clone dispatch locally to make some changes and put an APP value, but I'm not sure what the value should be. I tried with main but got ERROR: Error loading ASGI app. Could not import module "main"..

I feel restricted by my lack of python knowledge, hope you can help!

Add Initial "Create" Migration

I'm concerned I'm missing something, but I cannot successfully run the database upgrade command.

It is able to successfully run migration e75e103693f2: https://github.com/Netflix/dispatch/blob/develop/src/dispatch/alembic/versions/e75e103693f2_.py

However, this appears to not do anything.

Then the migration tries to run d0501fc6be89: https://github.com/Netflix/dispatch/blob/develop/src/dispatch/alembic/versions/d0501fc6be89_.py

In my environment, that fails with:

  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 588, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "application" does not exist

[SQL: ALTER TABLE application ADD COLUMN created_at TIMESTAMP WITHOUT TIME ZONE]
(Background on this error at: http://sqlalche.me/e/f405)

That's pretty consistent with the initial migration not actually creating any tables. I can verify that with Postgres that my database is indeed empty:

$ echo '\d' | dc exec -T postgres psql -U dispatch dispatch                                                                                          

              List of relations
 Schema |      Name       | Type  |  Owner   
--------+-----------------+-------+----------
 public | alembic_version | table | dispatch
(1 row)

Is there something I need to do to create the initial schema?

Problems with authentication after last upgrade

Hello!
I have problems with auth after upgrade dispatch.
image
My .env config this
DISPATCH_AUTHENTICATION_PROVIDER_SLUG=
DISPATCH_AUTHENTICATION_PROVIDER=
#DISPATCH_AUTHENTICATION_PROVIDER=""
#DISPATCH_AUTHENTICATION_PROVIDER_SLUG=
DISPATCH_AUTHENTICATION_PROVIDER_PKCE_JWKS=

Frontend

#VUE_APP_DISPATCH_AUTHENTICATION_PROVIDER_PKCE_OPEN_ID_CONNECT_URL=""
#VUE_APP_DISPATCH_AUTHENTICATION_PROVIDER_PKCE_CLIENT_ID=""

still getting errors for install.sh

Is there better forum for questions?

I'm sure there is an issue in my .env file, but I am not sure what setting causes this:

INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> e75e103693f2, Initial migration
INFO [alembic.runtime.migration] Running upgrade e75e103693f2 -> d0501fc6be89, empty message
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1247, in _execute_context
self.dialect.do_execute(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 588, in do_execute
cursor.execute(statement, parameters)
psycopg2.errors.UndefinedTable: relation "application" does not exist

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/bin/dispatch", line 8, in
sys.exit(entrypoint())
File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 811, in entrypoint
dispatch_cli()
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))

docker build fails

Am trying to docker build or executing /dispatch-docker/install.sh on a Mac under Ubuntu 20.04. Unfortunately the process fails with the following output.

Step 14/44 : RUN set -x     && wget -O /usr/local/bin/tini "https://github.com/krallin/tini/releases/download/v$TINI_VERSION/tini"     && wget -O /usr/local/bin/tini.asc "https://github.com/krallin/tini/releases/download/v$TINI_VERSION/tini.asc"     && gpg --batch --verify /usr/local/bin/tini.asc /usr/local/bin/tini     && rm /usr/local/bin/tini.asc     && chmod +x /usr/local/bin/tini
 ---> Using cache
 ---> ffdcf0d5d43e
Step 15/44 : COPY .nvmrc /usr/src/dispatch/
COPY failed: stat /var/lib/docker/tmp/docker-builder708155561/.nvmrc: no such file or directory

What am I doing wrong? Any tips or ideas? Thx in advance

Web errors

Unable to submit an incident, web container is throwing this, any help much appreciated.

Failed to load plugin zoom_conference. Reason: "Config 'ZOOM_API_USER_ID' is missing, and has no default."
WARNING:  Unable to import fbprophet, some metrics will not be usable.
WARNING:  Failed to load plugin zoom_conference. Reason: "Config 'ZOOM_API_USER_ID' is missing, and has no default."
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     9.211.132.131:56970 - "GET / HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/css/app.95d8a627.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56971 - "GET /static/css/chunk-vendors.54ed3ea1.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56972 - "GET /static/js/chunk-vendors.f9f651a8.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/js/app.1cedeeb4.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/css/definition-table.ebaaeb9b.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/css/definition-table~incident-dashboard~incident-table~incidents-report~incidents-status~individual-tabl~653abfa5.343268aa.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56976 - "GET /static/css/definition-table~incident-table~incidents-status~individual-table~knowledge-table~policy-table~routi~95f9995b.548fe094.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/css/error-403.5125a358.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56976 - "GET /static/css/errors-404.de8a6bb5.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/css/errors-500.bbf8b0ec.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/css/incident-dashboard~incident-table.b315c2ce.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56976 - "GET /static/css/incident-table.641f6b2c.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/css/incidents-report.9d21c0d7.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/css/individual-table.d5fecaa8.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/css/knowledge-table.d5fecaa8.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56976 - "GET /static/css/policy-table.9d21c0d7.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/css/routing-table~service-table.1d27bab4.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/css/tag-table.9d21c0d7.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/css/team-table.d5fecaa8.css HTTP/1.1" 200 OK
INFO:     9.211.132.131:56976 - "GET /static/js/definition-table.a05461b5.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/js/definition-table~incident-dashboard~incident-table~incidents-report~incidents-status~individual-tabl~653abfa5.c90c4de1.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/js/definition-table~incident-table~incidents-report~individual-table~knowledge-table~routing-table~serv~9c57d9df.7546f311.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/js/definition-table~incident-table~incidents-status~individual-table~knowledge-table~policy-table~routi~95f9995b.bd2967ff.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56972 - "GET /static/js/error-403.8c1e8dbb.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56971 - "GET /static/js/errors-404.c705045c.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/js/errors-500.f59c3e98.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56976 - "GET /static/js/incident-dashboard.d1db1531.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56971 - "GET /static/js/incidents-report.1147d598.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/js/incident-dashboard~incident-table.fae29dec.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/js/incident-table.9ff946a3.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/js/incidents-status.7b1e502b.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56971 - "GET /static/js/individual-table.86a83a39.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56972 - "GET /static/js/knowledge-table.0d010175.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/js/policy-table.1ecce372.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56974 - "GET /static/js/routing-table.3c4ab2f4.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56971 - "GET /static/js/routing-table~service-table.efa19ce9.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56972 - "GET /static/js/search-result-list.f64f2c7c.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/js/service-table.4d71d004.js HTTP/1.1" 200 OK
INFO:     9.211.132.131:56975 - "GET /static/js/tag-table.05994c1a.js HTTP/1.1" 200 OK
ERROR:    Unable to find slug:  in self.all version 1: <generator object PluginManager.all at 0x7ff2d6813740> or version 2: <generator object PluginManager.all at 0x7ff2d6813740>
INFO:     9.211.132.131:56974 - "GET /api/v1/incident_types/?itemsPerPage=50&sortBy[]=name&descending[]=false HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 25, in __call__
    response = await self.dispatch_func(request, self.call_next)
  File "/usr/local/lib/python3.8/site-packages/dispatch/main.py", line 103, in dispatch
    metric_provider.timer("server.call.elapsed", value=elapsed_time, tags=tags)
  File "/usr/local/lib/python3.8/site-packages/dispatch/metrics.py", line 40, in timer
    p = plugins.get(provider)
  File "/usr/local/lib/python3.8/site-packages/dispatch/plugins/base/manager.py", line 43, in get
    raise KeyError(slug)
KeyError: ''
INFO:     9.211.132.131:56972 - "GET /static/fonts/Roboto-Regular.73f0a88b.woff2 HTTP/1.1" 200 OK
INFO:     9.211.132.131:56970 - "GET /static/fonts/materialdesignicons-webfont.7fb0e378.woff2 HTTP/1.1" 200 OK
INFO:     9.211.132.131:56971 - "GET /static/fonts/Roboto-Medium.90d16760.woff2 HTTP/1.1" 200 OK
ERROR:    Unable to find slug:  in self.all version 1: <generator object PluginManager.all at 0x7ff2d47787b0> or version 2: <generator object PluginManager.all at 0x7ff2d47787b0>
INFO:     9.211.132.131:56975 - "GET /api/v1/incident_priorities/?sortBy[]=view_order&descending[]=false HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 25, in __call__
    response = await self.dispatch_func(request, self.call_next)
  File "/usr/local/lib/python3.8/site-packages/dispatch/main.py", line 103, in dispatch
    metric_provider.timer("server.call.elapsed", value=elapsed_time, tags=tags)
  File "/usr/local/lib/python3.8/site-packages/dispatch/metrics.py", line 40, in timer
    p = plugins.get(provider)
  File "/usr/local/lib/python3.8/site-packages/dispatch/plugins/base/manager.py", line 43, in get
    raise KeyError(slug)
KeyError: ''

What's the keyerror?

DB migration running before DB init

I am running the installation in a fresh Ubuntu VM with docker support. After running the ./install.sh for the first time, it is failing with following error:

`Successfully built 2d9cad6cd203
Successfully tagged dispatch-local:latest

Docker images built.
Creating network "dispatch_default" with the default driver
Creating dispatch_postgres_1 ... done

Setting up database...
Starting dispatch_postgres_1 ... done
Usage: dispatch [OPTIONS] COMMAND [ARGS]...

Command-line interface to Dispatch.

Options:
--version Show the version and exit.
--help Show this message and exit.

Commands:
contact All commands for contact manipulation.
database Container for all dispatch database commands.
incident All commands for incident manipulation.
plugins All commands for plugin manipulation.
scheduler Container for all dispatch scheduler commands.
server Container for all dispatch server commands.
term All commands for term manipulation.
Starting dispatch_postgres_1 ... done
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> e75e103693f2, Initial migration
INFO [alembic.runtime.migration] Running upgrade e75e103693f2 -> d0501fc6be89, empty message
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1247, in _execute_context
self.dialect.do_execute(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 588, in do_execute
cursor.execute(statement, parameters)
psycopg2.errors.UndefinedTable: relation "application" does not exist

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/bin/dispatch", line 8, in
sys.exit(entrypoint())
File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 811, in entrypoint
dispatch_cli()
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 592, in upgrade_database
alembic_command.upgrade(alembic_cfg, revision, sql=sql, tag=tag)
File "/usr/local/lib/python3.8/site-packages/alembic/command.py", line 298, in upgrade
script.run_env()
File "/usr/local/lib/python3.8/site-packages/alembic/script/base.py", line 489, in run_env
util.load_python_file(self.dir, "env.py")
File "/usr/local/lib/python3.8/site-packages/alembic/util/pyfiles.py", line 98, in load_python_file
module = load_module_py(module_id, path)
File "/usr/local/lib/python3.8/site-packages/alembic/util/compat.py", line 184, in load_module_py
spec.loader.exec_module(module)
File "", line 783, in exec_module
File "", line 219, in call_with_frames_removed
File "/usr/local/lib/python3.8/site-packages/dispatch/alembic/env.py", line 84, in
run_migrations_online()
File "/usr/local/lib/python3.8/site-packages/dispatch/alembic/env.py", line 78, in run_migrations_online
context.run_migrations()
File "", line 8, in run_migrations
File "/usr/local/lib/python3.8/site-packages/alembic/runtime/environment.py", line 846, in run_migrations
self.get_context().run_migrations(**kw)
File "/usr/local/lib/python3.8/site-packages/alembic/runtime/migration.py", line 518, in run_migrations
step.migration_fn(**kw)
File "/usr/local/lib/python3.8/site-packages/dispatch/alembic/versions/d0501fc6be89
.py", line 21, in upgrade
op.add_column("application", sa.Column("created_at", sa.DateTime(), nullable=True))
File "", line 8, in add_column
File "", line 3, in add_column
File "/usr/local/lib/python3.8/site-packages/alembic/operations/ops.py", line 1927, in add_column
return operations.invoke(op)
File "/usr/local/lib/python3.8/site-packages/alembic/operations/base.py", line 374, in invoke
return fn(self, operation)
File "/usr/local/lib/python3.8/site-packages/alembic/operations/toimpl.py", line 132, in add_column
operations.impl.add_column(table_name, column, schema=schema, **kw)
File "/usr/local/lib/python3.8/site-packages/alembic/ddl/impl.py", line 237, in add_column
self._exec(base.AddColumn(table_name, column, schema=schema))
File "/usr/local/lib/python3.8/site-packages/alembic/ddl/impl.py", line 140, in _exec
return conn.execute(construct, *multiparams, **params)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 984, in execute
return meth(self, multiparams, params)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/ddl.py", line 72, in _execute_on_connection
return connection._execute_ddl(self, multiparams, params)
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1041, in _execute_ddl
ret = self._execute_context(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1287, in _execute_context
self.handle_dbapi_exception(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1481, in handle_dbapi_exception
util.raise
(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 178, in raise

raise exception
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1247, in _execute_context
self.dialect.do_execute(
File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 588, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "application" does not exist

[SQL: ALTER TABLE application ADD COLUMN created_at TIMESTAMP WITHOUT TIME ZONE]
(Background on this error at: http://sqlalche.me/e/f405)
Cleaning up... `

Docker status after this:
sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2e73faaaaf72 dispatch-local "dispatch database u…" 4 minutes ago Exited (1) 4 minutes ago dispatch_web_run_4926996710db dd61a2d4496d dispatch-local "dispatch --help" 4 minutes ago Exited (0) 4 minutes ago dispatch_web_run_ccbde7802009 235a22ea542f postgres:9.6 "docker-entrypoint.s…" 4 minutes ago Exited (0) 4 minutes ago dispatch_postgres_1

docker start 235a22ea542f # it works though and postgres container starts up with empty dispatcher database.

As per the error message, it is trying to run migration process at the time of installation only. Please assist.

Please provide more details on Slack Integration

How does the whole slack thing work, can I see a demo by any chance as its not clear at all by the documentation. Thanks!
I have a bot, I have all the info in the .env. Can I start incidents from Slack?
Screenshot 2020-04-21 at 17 07 06

'undefined' error when trying to add data to UI

I'm in the dashboard UI now and trying to input some test incident types/services etc to populate the info for testing. As far as I know I've set up all the integrations via .env.

I'm now getting an 'undefined' error (screenshot attached) when trying to add anything into the UI. Are there any logs I can view to get to more info why it's failing? Worth mentioning I'm running as a docker container from the dispatch-docker repo.

Any pointers appreciated, thanks!

UI

REQUEST: Configure enabled/disabled plugins

Reading through the docs and the code, I'm not able to discern if there's a way to boot the core Dispatch experience without the Slack, Google, Jira, and PagerDuty plugins?

The docs and the way the app behaves appear to imply that Dispatch will not work without them configured.

However, suppose I just want to get started to evaluate without configuring everything, I'd like a way to disable those plugins just to reduce the distance from" 0-to-UI" for evaluation purposes.

Or boot Dispatch by default and enable plugins one at a time via an Admin UI.

If this isn't already supported I can update the issue title to make this more of a feature request.

We're facing more issues. We have been unable to get this thing up and running in over a week.

We're facing more issues. We have been unable to get this thing up and running in over a week.

Our latest error is:

ValueError: Could not deserialize key data.
ERROR: Unable to import dispatch.plugins.dispatch_google.groups.plugin.GoogleGroupParticipantGroupPlugin. Reason: Could not deserialize key data.
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/dispatch/common/managers.py", line 61, in all
results.append(cls())
File "/usr/local/lib/python3.8/site-packages/dispatch/plugins/dispatch_google/groups/plugin.py", line 122, in init
self.client = get_service("admin", "directory_v1", scopes)
File "/usr/local/lib/python3.8/site-packages/dispatch/plugins/dispatch_google/common.py", line 39, in get_service
credentials = service_account.Credentials.from_service_account_file(
File "/usr/local/lib/python3.8/site-packages/google/oauth2/service_account.py", line 217, in from_service_account_file
info, signer = _service_account_info.from_filename(
File "/usr/local/lib/python3.8/site-packages/google/auth/_service_account_info.py", line 74, in from_filename
return data, from_dict(data, require=require)
File "/usr/local/lib/python3.8/site-packages/google/auth/_service_account_info.py", line 55, in from_dict
signer = crypt.RSASigner.from_service_account_info(data)
File "/usr/local/lib/python3.8/site-packages/google/auth/crypt/base.py", line 113, in from_service_account_info
return cls.from_string(
File "/usr/local/lib/python3.8/site-packages/google/auth/crypt/_cryptography_rsa.py", line 146, in from_string
private_key = serialization.load_pem_private_key(
File "/usr/local/lib/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py", line 16, in load_pem_private_key
return backend.load_pem_private_key(data, password)
File "/usr/local/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1085, in load_pem_private_key
return self._load_key(
File "/usr/local/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1315, in _load_key
self._handle_key_loading_error()
File "/usr/local/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py", line 1373, in _handle_key_loading_error
raise ValueError("Could not deserialize key data.")
ValueError: Could not deserialize key data.
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

We're using the Google PEM file, and we've tried several variations: with new-lines, without, base64ed, etc. But we cannot launch this thing.

Can we get a full working .env file so we can back-trace the config from there and figure this out? The current documentation is not very helpful.

Originally posted by @ayush-sharma in #55 (comment)

Dispatch development instance

Hi,

I tried bringing up the the Dispatch development environment.
The Vuejs part with npm install serve, and the FastAPI part with the run.py script after installing the dependecies in the virutalenv.

The problem is that I can not get the frontend working due to the CORS errors, is there a simple way to disable Google OAuth authentication and to run the dispatch without it? I just want to evaluate the frontend part of Dispatch.

Feature : initiating incident from slack via slack commands

i would like to start implementing this feature if no one is already working on it.
starting an incident from slack and invite people from previously configured to the channel and then push all the chat history to JIRA or to dispatch also once the incident is created the ONCALL personal in pagerduty will get notified about it as well ( will get a page as well )

Slack should be configured accordingly to point the incident related commands to dispatch

Roadmap for Dispatch

Hi there,

First of all, I am really thrilled you've open-sourced this project.
It looks exactly like the sort of thing we've been looking for to improve our approach to incident management.

To this end, I was wondering if you had a roadmap for features you'll be adding?
I was also keen to add some further integrations but I wanted to check you're happy to receive support and contributions?

Possible typo in cli.py (clean_incident_artifacts function)

Hello, I am working on setting up a dispatch instance and I have come across the following error.

Starting dispatch_postgres_1 ... done Traceback (most recent call last): File "/usr/local/bin/dispatch", line 8, in <module> sys.exit(entrypoint()) File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 845, in entrypoint dispatch_cli() File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in __call__ return self.main(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main rv = self.invoke(ctx) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke return ctx.invoke(self.callback, **ctx.params) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 408, in clean_incident_artifacts from dispatch.plugins.dispatch_google.drive.config import GOOGLE_DOMAIN ModuleNotFoundError: No module named 'dispatch.plugins.dispatch_google.drive.config'

this was from running docker-compose run web incident clean

I don't have a full development instance set up to test this. Can you confirm if this function is working properly for you in your deployment? I suspect there may be a misnamed module.

def clean_incident_artifacts(pattern): """This command will clean up incident artifacts. Useful for development.""" import re from dispatch.plugins.dispatch_google.drive.config import GOOGLE_DOMAIN

Thank you
-Alexa Kelley

Cannot load sample data in database with `dispatch database restore --dump-file dispatch-sample-data.dump`

root@0ef891f171ee/-(o_o)-\0ef891f171ee:/usr/local/lib/python3.8/site-packages/dispatch# dispatch database restore --dump-file /root/dispatch-sample-data.dump
Traceback (most recent call last):
  File "/usr/local/bin/dispatch", line 8, in <module>                         
    sys.exit(entrypoint())   
  File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 843, in entrypoint
    dispatch_cli()                                        
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)               
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main                                          
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 511, in restore_database
    from sh import psql, createdb
ImportError: cannot import name 'psql' from 'sh' (/usr/local/lib/python3.8/site-packages/sh.py)

gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu fails.

While attempting to build the web image:

Step 12/46 : RUN set -x     && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)"     && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc"     && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu     && rm -r /usr/local/bin/gosu.asc     && chmod +x /usr/local/bin/gosu
 ---> Running in 65056ab09231
+ dpkg --print-architecture
+ wget -O /usr/local/bin/gosu https://github.com/tianon/gosu/releases/download/1.11/gosu-amd64
--2020-05-06 01:03:57--  https://github.com/tianon/gosu/releases/download/1.11/gosu-amd64
Resolving github.com (github.com)... 192.30.255.112
Connecting to github.com (github.com)|192.30.255.112|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/19708981/82e9dd00-d091-11e8-8734-a1caffcee352?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200506%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200506T010357Z&X-Amz-Expires=300&X-Amz-Signature=4c454ef9702f4d502f5e4ccd1e12f0014264065ce87a9ccb344468b3c5887b5c&X-Amz-SignedHeaders=host&actor_id=0&repo_id=19708981&response-content-disposition=attachment%3B%20filename%3Dgosu-amd64&response-content-type=application%2Foctet-stream [following]
--2020-05-06 01:03:57--  https://github-production-release-asset-2e65be.s3.amazonaws.com/19708981/82e9dd00-d091-11e8-8734-a1caffcee352?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200506%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200506T010357Z&X-Amz-Expires=300&X-Amz-Signature=4c454ef9702f4d502f5e4ccd1e12f0014264065ce87a9ccb344468b3c5887b5c&X-Amz-SignedHeaders=host&actor_id=0&repo_id=19708981&response-content-disposition=attachment%3B%20filename%3Dgosu-amd64&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.237.91
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.237.91|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2294944 (2.2M) [application/octet-stream]
Saving to: ‘/usr/local/bin/gosu’

     0K .......... .......... .......... .......... ..........  2%  562K 4s
    50K .......... .......... .......... .......... ..........  4%  603K 4s
   100K .......... .......... .......... .......... ..........  6%  559K 4s
   150K .......... .......... .......... .......... ..........  8% 6.50M 3s
   200K .......... .......... .......... .......... .......... 11% 32.8M 2s
   250K .......... .......... .......... .......... .......... 13%  628K 2s
   300K .......... .......... .......... .......... .......... 15% 5.47M 2s
   350K .......... .......... .......... .......... .......... 17% 12.9M 2s
   400K .......... .......... .......... .......... .......... 20%  550K 2s
   450K .......... .......... .......... .......... .......... 22% 17.8M 2s
   500K .......... .......... .......... .......... .......... 24%  584K 2s
   550K .......... .......... .......... .......... .......... 26% 5.33M 2s
   600K .......... .......... .......... .......... .......... 29% 7.40M 1s
   650K .......... .......... .......... .......... .......... 31%  702K 1s
   700K .......... .......... .......... .......... .......... 33% 9.17M 1s
   750K .......... .......... .......... .......... .......... 35% 7.24M 1s
   800K .......... .......... .......... .......... .......... 37%  650K 1s
   850K .......... .......... .......... .......... .......... 40% 6.94M 1s
   900K .......... .......... .......... .......... .......... 42% 17.8M 1s
   950K .......... .......... .......... .......... .......... 44%  664K 1s
  1000K .......... .......... .......... .......... .......... 46% 4.91M 1s
  1050K .......... .......... .......... .......... .......... 49% 6.22M 1s
  1100K .......... .......... .......... .......... .......... 51%  752K 1s
  1150K .......... .......... .......... .......... .......... 53% 3.45M 1s
  1200K .......... .......... .......... .......... .......... 55% 4.59M 1s
  1250K .......... .......... .......... .......... .......... 58%  737K 1s
  1300K .......... .......... .......... .......... .......... 60% 7.07M 1s
  1350K .......... .......... .......... .......... .......... 62%  589K 1s
  1400K .......... .......... .......... .......... .......... 64% 3.30M 1s
  1450K .......... .......... .......... .......... .......... 66%  580K 1s
  1500K .......... .......... .......... .......... .......... 69% 7.23M 1s
  1550K .......... .......... .......... .......... .......... 71% 21.1M 0s
  1600K .......... .......... .......... .......... .......... 73%  602K 0s
  1650K .......... .......... .......... .......... .......... 75%  587K 0s
  1700K .......... .......... .......... .......... .......... 78% 5.38M 0s
  1750K .......... .......... .......... .......... .......... 80% 18.4M 0s
  1800K .......... .......... .......... .......... .......... 82%  649K 0s
  1850K .......... .......... .......... .......... .......... 84% 17.5M 0s
  1900K .......... .......... .......... .......... .......... 87% 6.66M 0s
  1950K .......... .......... .......... .......... .......... 89%  584K 0s
  2000K .......... .......... .......... .......... .......... 91% 5.51M 0s
  2050K .......... .......... .......... .......... .......... 93% 14.9M 0s
  2100K .......... .......... .......... .......... .......... 95%  722K 0s
  2150K .......... .......... .......... .......... .......... 98% 5.16M 0s
  2200K .......... .......... .......... .......... .         100% 5.63M=1.6s

2020-05-06 01:03:59 (1.34 MB/s) - ‘/usr/local/bin/gosu’ saved [2294944/2294944]

+ dpkg --print-architecture
+ wget -O /usr/local/bin/gosu.asc https://github.com/tianon/gosu/releases/download/1.11/gosu-amd64.asc
--2020-05-06 01:03:59--  https://github.com/tianon/gosu/releases/download/1.11/gosu-amd64.asc
Resolving github.com (github.com)... 192.30.255.113
Connecting to github.com (github.com)|192.30.255.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/19708981/82514680-d091-11e8-9b17-2b91cf6a780f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200506%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200506T010400Z&X-Amz-Expires=300&X-Amz-Signature=d02bcbb17bb93ed4fa4f629bb50c18ad2f70fc7122374f0032998e945e178c42&X-Amz-SignedHeaders=host&actor_id=0&repo_id=19708981&response-content-disposition=attachment%3B%20filename%3Dgosu-amd64.asc&response-content-type=application%2Foctet-stream [following]
--2020-05-06 01:04:00--  https://github-production-release-asset-2e65be.s3.amazonaws.com/19708981/82514680-d091-11e8-9b17-2b91cf6a780f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20200506%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200506T010400Z&X-Amz-Expires=300&X-Amz-Signature=d02bcbb17bb93ed4fa4f629bb50c18ad2f70fc7122374f0032998e945e178c42&X-Amz-SignedHeaders=host&actor_id=0&repo_id=19708981&response-content-disposition=attachment%3B%20filename%3Dgosu-amd64.asc&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.217.32.164
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.217.32.164|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 566 [application/octet-stream]
Saving to: ‘/usr/local/bin/gosu.asc’

     0K                                                       100% 12.2M=0s

2020-05-06 01:04:00 (12.2 MB/s) - ‘/usr/local/bin/gosu.asc’ saved [566/566]

+ gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu
gpg: Signature made Mon Oct 15 22:44:22 2018 UTC
gpg:                using RSA key B42F6819007F00F88E364FD4036A9C25BF357DD4
gpg: Can't check signature: No public key

Container fails to start due to missing "static" folder

When running docker-compose up after install.sh script finishes, the following error appears:

dispatch-scheduler_1  | Traceback (most recent call last):
dispatch-scheduler_1  |   File "/usr/local/bin/dispatch", line 8, in <module>
dispatch-scheduler_1  |     sys.exit(entrypoint())
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 766, in entrypoint
dispatch-scheduler_1  |     dispatch_cli()
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 764, in __call__
dispatch-scheduler_1  |     return self.main(*args, **kwargs)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 717, in main
dispatch-scheduler_1  |     rv = self.invoke(ctx)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1137, in invoke
dispatch-scheduler_1  |     return _process_result(sub_ctx.command.invoke(sub_ctx))
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1137, in invoke
dispatch-scheduler_1  |     return _process_result(sub_ctx.command.invoke(sub_ctx))
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 956, in invoke
dispatch-scheduler_1  |     return ctx.invoke(self.callback, **ctx.params)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 555, in invoke
dispatch-scheduler_1  |     return callback(*args, **kwargs)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 331, in main
dispatch-scheduler_1  |     run(**kwargs)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 354, in run
dispatch-scheduler_1  |     server.run()
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 382, in run
dispatch-scheduler_1  |     loop.run_until_complete(self.serve(sockets=sockets))
dispatch-scheduler_1  |   File "uvloop/loop.pyx", line 1456, in uvloop.loop.Loop.run_until_complete
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 389, in serve
dispatch-scheduler_1  |     config.load()
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/config.py", line 288, in load
dispatch-scheduler_1  |     self.loaded_app = import_from_string(self.app)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/uvicorn/importer.py", line 20, in import_from_string
dispatch-scheduler_1  |     module = importlib.import_module(module_str)
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
dispatch-scheduler_1  |     return _bootstrap._gcd_import(name[level:], package, level)
dispatch-scheduler_1  |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
dispatch-scheduler_1  |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
dispatch-scheduler_1  |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
dispatch-scheduler_1  |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
dispatch-scheduler_1  |   File "<frozen importlib._bootstrap_external>", line 783, in exec_module
dispatch-scheduler_1  |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/dispatch/main.py", line 32, in <module>
dispatch-scheduler_1  |     frontend.mount("/", StaticFiles(directory=STATIC_DIR), name="app")
dispatch-scheduler_1  |   File "/usr/local/lib/python3.8/site-packages/starlette/staticfiles.py", line 55, in __init__
dispatch-scheduler_1  |     raise RuntimeError(f"Directory '{directory}' does not exist")
dispatch-scheduler_1  | RuntimeError: Directory '/usr/local/lib/python3.8/site-packages/dispatch/static/dispatch/dist' does not exist
web_1                 | Traceback (most recent call last):
web_1                 |   File "/usr/local/bin/dispatch", line 8, in <module>
web_1                 |     sys.exit(entrypoint())
web_1                 |   File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 766, in entrypoint
web_1                 |     dispatch_cli()
web_1                 |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 764, in __call__
web_1                 |     return self.main(*args, **kwargs)
web_1                 |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 717, in main
web_1                 |     rv = self.invoke(ctx)
web_1                 |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1137, in invoke
web_1                 |     return _process_result(sub_ctx.command.invoke(sub_ctx))
web_1                 |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1137, in invoke
web_1                 |     return _process_result(sub_ctx.command.invoke(sub_ctx))
web_1                 |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 956, in invoke
web_1                 |     return ctx.invoke(self.callback, **ctx.params)
web_1                 |   File "/usr/local/lib/python3.8/site-packages/click/core.py", line 555, in invoke
web_1                 |     return callback(*args, **kwargs)
web_1                 |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 331, in main
web_1                 |     run(**kwargs)
web_1                 |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 354, in run
web_1                 |     server.run()
web_1                 |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 382, in run
web_1                 |     loop.run_until_complete(self.serve(sockets=sockets))
web_1                 |   File "uvloop/loop.pyx", line 1456, in uvloop.loop.Loop.run_until_complete
web_1                 |   File "/usr/local/lib/python3.8/site-packages/uvicorn/main.py", line 389, in serve
web_1                 |     config.load()
web_1                 |   File "/usr/local/lib/python3.8/site-packages/uvicorn/config.py", line 288, in load
web_1                 |     self.loaded_app = import_from_string(self.app)
web_1                 |   File "/usr/local/lib/python3.8/site-packages/uvicorn/importer.py", line 20, in import_from_string
web_1                 |     module = importlib.import_module(module_str)
web_1                 |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
web_1                 |     return _bootstrap._gcd_import(name[level:], package, level)
web_1                 |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
web_1                 |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
web_1                 |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
web_1                 |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
web_1                 |   File "<frozen importlib._bootstrap_external>", line 783, in exec_module
web_1                 |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
web_1                 |   File "/usr/local/lib/python3.8/site-packages/dispatch/main.py", line 32, in <module>
web_1                 |     frontend.mount("/", StaticFiles(directory=STATIC_DIR), name="app")
web_1                 |   File "/usr/local/lib/python3.8/site-packages/starlette/staticfiles.py", line 55, in __init__
web_1                 |     raise RuntimeError(f"Directory '{directory}' does not exist")
web_1                 | RuntimeError: Directory '/usr/local/lib/python3.8/site-packages/dispatch/static/dispatch/dist' does not exist

The cause seems to be that the src/dispatch/static folder is missing in the built docker image.

[feature request] Print all config items in server config command, instead of showing .env file contents

dispatch server config command, or show_config() in https://github.com/Netflix/dispatch/blob/develop/src/dispatch/cli.py#L804, shows no configs when dispatch is brought up via docker-compose, as all configs are read from system environment variables, not local .env file.

Additionally, starlette.config.Config.get() can take default value, but show_config() ignores that, or it prints only explicitly configured values. What I really expect is to print what dispatch interpreted given configurations (i.e. cast=... should be considered somehow). I don't mind how .env file is parsed.

I haven't dig internals of dispatch, but what I expect is something in pseudo-code:

from dispatch.config import config

core_configs = config.get_configs()
table = [item for item in core_configs.items()]
for p in plugins.all():
  plugin_configs = p.get_configs()
  table += [item for item in plugin_configs.items()]

click.secho(tabulate(table, ...

This means, config.py and each plugins are supposed to implement get_configs() function, but it shouldn't be hard.

request for info: openness to changes to accommodate for somewhat different workflow

Hey guys,

First off, thanks for open-sourcing Dispatch!

At my company we're increasing the level of automation in our incident management process. Dispatch is being considered as one of the candidates to support this. To better understand its current feature-set and its viability in our context, we got it up-and-running using most of the currently mandatory plugins (merely disabled Zoom) and played around with it. To make it fit our workflow, we would need to be able to customize certain things and add others (aside from having to create an alternative to the G Suite plugin as we're not using that).

I would like to better understand to what extent the following changes would be considered welcome ones:

  • Allow for customization of Jira plugin. Current plugin contains some seemingly Netflix-specific things such as some custom fields, priority mapping, etc. These things should be customizable. Besides, I guess it would be good to leverage the create metadata that Jira exposes.
  • Allow for customization of (Slack) messages. Guess it would be good to use a (potentially logic-less) template engine for the messages and extract them from the Python code. That should make customization easier as well.
  • In our workflow we also create an incident-specific Slack channel for collaboration purposes. However, we also announce incident status changes in a dedicated shared Slack channel. Thus such functionality we'd like to add.
  • Make conference plugin optional; guess this is already covered by #55.
  • Allow for adding custom key-value pairs as metadata to an incident that is stored in the DB and exposed via the API. We would like to e.g. keep track of what customers are involved, status around communication towards those customers, preliminary root cause. Other users might have other needs, so being able to add custom key-value pairs would facilitate this. Potentially this is what the tags or terms are intended for, but I kind of fail to understand the idea behind both data types (as well as the definition one btw).
  • Allow for customization of incident participant roles. We would like to e.g. include SME as a dedicated role while at the same time being able to fill in the subject while assigning the role (e.g "SME - some specific subject" as a particpant role, or possibly another partipant attribute). Aside from that, we don't distinguish a separate scribe and liaison at this moment.

Other potentially interesting changes:

  • Propagation of incident-specific events (whatever source) to timeline as part of investigation documents. I was wondering if that's something you are already considering any way?
  • Include timeline in incident status update notifications. Our incident commanders currently manually keep track of the incident timeline which is obviously something we'd like (partially) automate. Besides, we do inckude a high-level timeline in each of our status update. Dispatch captures all events related to an incident which is nice but a bit too much information for the high-level timeline we normally share. Perhaps it would be possible to somehow 'tag' the events to share in such status updates?
  • Allow manual creation of incidents from Slack. Ah I see that's already covered by #180.
  • Include comments in Jira ticket as part of the events? This would obviously increase complexity as it requires a Jira webhook to be installed.
  • Leverage Home tab in Slack to show list of currently ongoing and recently closed incidents, including links to some of their important resources (e.g. conversation weblink, ticket weblink, etc.). That should be relatively straight-forward and remove the need for people to use the Dispatch UI.

Could you please comment on the above?

Thanks in advance!

Problems with create Incident

Hello!
I have two questions. I cannot add Commander to incident when i create an incident.
image
In my .env file I set INCIDENT_PLUGIN_CONTACT_SLUG to default. But i don't create some slack channel to converstaion. And i see in log this.
image
Now I want to test the dispatch offline (without some plugins, such as Jira, slack, etc.). I just want to see the person who took the incident to work. How can i do this?

My second question. How i Can create Task? I don't have some button to create(

Dispatch install.sh fails: Service 'web' failed to build

Hi,

When I run install.sh it fails with the following error:

...
Step 10/43 : RUN for key in     B42F6819007F00F88E364FD4036A9C25BF357DD4     595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7     94AE36675C464D64BAFA68DD7434390BDBE9B9C5     FD3A5288F042B6850C66B31F09FE44734EB7990E     71DCFD284A79C3B38668286BC97EC7A07EDE3FC1     DD8F2338BAE7501E3DD5AC78C273792F7D83545D     C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8     B9AE9905FFD7803F25714661B63B535A4C206CA9     77984A986EBC2AA786BC0F66B01FBB92821C587A     8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600     4ED778F539E3634C779C87C6D7062848A1AB005C     A48C2BEE680E841632CD4E44F07496B3EB3C1762     B9E2F5981AA6E0CD28160D9FF13993A75599653C     ; do     gpg --batch --keyserver hkps://mattrobenolt-keyserver.global.ssl.fastly.net:443 --recv-keys "$key";     done
 ---> Running in 5b7fc432e312
gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: keyserver receive failed: Server indicated a failure
gpg: keyserver receive failed: Server indicated a failure
...
gpg: keyserver receive failed: Server indicated a failure
Removing intermediate container 5b7fc432e312
ERROR: Service 'web' failed to build: The command '/bin/sh -c for key in...

Running on KDE neon User Edition 5.18 (18.04), Docker version 19.03.7 and docker-compose version 1.25.4.

Unable to import fbprophet, some metrics will not be usable.

1.- Required plugins added.
2.- Dispatch built with success.
3.- UI accesible.
4.- Documents, Service, Incident types available to be created by the UI.

But no able to save incidents, getting some 500 and 422 error codes.

Tracking the container logs for those errors I've got:

docker logs 60a0c55565ac -f --until=2s
No metric providers specified metrics will not be sent.
WARNING:  Unable to import fbprophet, some metrics will not be usable.
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

Recreating the error / bug when saving the incident using the UI:

INFO:     192.168.169.11:49991 - "GET /api/v1/incidents/metric/forecast/all HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/usr/local/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 26, in __call__
    await response(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/responses.py", line 197, in __call__
    async for chunk in self.body_iterator:
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 56, in body_stream
    task.result()
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 38, in coro
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/sentry_asgi/middleware.py", line 22, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/sentry_asgi/middleware.py", line 19, in __call__
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 26, in __call__
    await response(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/responses.py", line 197, in __call__
    async for chunk in self.body_iterator:
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 56, in body_stream
    task.result()
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 38, in coro
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 26, in __call__
    await response(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/responses.py", line 197, in __call__
    async for chunk in self.body_iterator:
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 56, in body_stream
    task.result()
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/base.py", line 38, in coro
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 550, in __call__
    await route.handle(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 376, in handle
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/fastapi/applications.py", line 149, in __call__
    await super().__call__(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/applications.py", line 102, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 181, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.8/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc from None
  File "/usr/local/lib/python3.8/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 550, in __call__
    await route.handle(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 227, in handle
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.8/site-packages/starlette/routing.py", line 41, in app
    response = await func(request)
  File "/usr/local/lib/python3.8/site-packages/fastapi/routing.py", line 165, in app
    raw_response = await run_endpoint_function(
  File "/usr/local/lib/python3.8/site-packages/fastapi/routing.py", line 121, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "/usr/local/lib/python3.8/site-packages/starlette/concurrency.py", line 34, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.8/site-packages/dispatch/incident/views.py", line 144, in get_incident_forecast
    return make_forecast(db_session=db_session, incident_type=incident_type)
  File "/usr/local/lib/python3.8/site-packages/dispatch/incident/metrics.py", line 72, in make_forecast
    dataframe = pd.DataFrame.from_dict(dataframe_dict)
NameError: name 'pd' is not defined

and as explained here:

Netflix/dispatch-docker#34 (comment)

In the file https://github.com/Netflix/dispatch/blob/develop/src/dispatch/incident/metrics.py

States (from line 18 to 22)

try:
    from fbprophet import Prophet
    import pandas as pd
except ImportError:
    log.warning("Unable to import fbprophet, some metrics will not be usable.")

It seems that module fbprophet is missing and/or was not imported during the installation.

Include a Mattermost chat communication plugin

Mattermost is an on-prem workplace chat solution that is very similar to Slack. It would be nice if Dispatch had support for it as well.

This request relies on #55 and would likely require refactoring the codebase to have a common internal interface, implemented by both the Slack and Mattermost plugins, for chat systems.

Support Basic Authentication

For new folks either evaluating dispatch or simply not in the position to set up oauth flows, we should support basic username/password authentication.

Roughly speaking this will require:

  • Create User table
  • Create /login endpoint
  • Add login UI

Database upgrade command fails due to missing alembic files

The initial database upgrade command in the install.sh script fails. Running the command docker-compose run --rm web database upgrade results in the following error:

Traceback (most recent call last):
  File "/usr/local/bin/dispatch", line 8, in <module>
    sys.exit(entrypoint())
  File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 766, in entrypoint
    dispatch_cli()
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.8/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/dispatch/cli.py", line 553, in upgrade_database
    alembic_command.upgrade(alembic_cfg, revision, sql=sql, tag=tag)
  File "/usr/local/lib/python3.8/site-packages/alembic/command.py", line 278, in upgrade
    script = ScriptDirectory.from_config(config)
  File "/usr/local/lib/python3.8/site-packages/alembic/script/base.py", line 126, in from_config
    script_location = config.get_main_option("script_location")
  File "/usr/local/lib/python3.8/site-packages/alembic/config.py", line 293, in get_main_option
    return self.get_section_option(self.config_ini_section, name, default)
  File "/usr/local/lib/python3.8/site-packages/alembic/config.py", line 276, in get_section_option
    raise util.CommandError(
alembic.util.exc.CommandError: No config file '/usr/local/lib/python3.8/site-packages/dispatch/alembic.ini' found, or file has no '[alembic]' section

It appears that the cause may be the src/dispatch/alembic folder and the src/dispatch/alembic.ini file are missing in the built docker image.

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.