Code Monkey home page Code Monkey logo

morgue's Introduction

morgue Build Status Code Climate

a safe place for all your postmortem data

Overview

This is a PHP based web application to help manage your postmortems. It has a pluggable feature system and can pull in related information from IRC and JIRA as well as storing relevant links and graphs. This talk from DevOpsDays NYC 2013 gives an introduction and shows some of its features.

You can also join #morgue on Freenode IRC if you have questions.

Morgue tour

Index page

Morgue index page

Creating a new post mortem

Creating a new Post Mortem

Live edit page

Editing a Post Mortem

Scheduling a Post Mortem

Timeline of events

Remediations items

History tracking

Setup

Requirements

  • PHP 7.0 or higher
  • MySQL 5.5 or higher
  • PHP MySQL driver
  • Apache
  • mod_rewrite

Create a morgue configuration file

In the cloned repo, use the example.json file as a template to create your own configuration file.

cp config/example.json config/development.json

NOTES: You may need to remove references to "custom_feature" from your development.json as those only exist as examples to show you how to add custom features to your Morgue installation.

Composer

Morgue relies on the Slim Framework, a dependency that can be easily managed by Composer. Directions to install composer can be found on here). Once installed, run :

php composer.phar update

Apache

This is a basic example for an Apache vhost. The MORGUE_ENVIRONMENT variable is used to determine which config file to use (see above step).

    <VirtualHost *:80>
      ServerName   morgue.hostname.com

      DocumentRoot /var/www/morgue/htdocs

      <Directory /var/www/morgue/htdocs>
        AllowOverride All
      </Directory>

      SetEnv MORGUE_ENVIRONMENT development

      php_value include_path "/var/www/morgue:/var/www/morgue/features"
    </VirtualHost>

NOTE: If you maintain a custom Morgue features outside the document root, be sure to include that directory in the php_value include_path directive.

Restart apache and hit the servername you defined above.

MySQL

Create a database named morgue and give access to the morgue user with the morgue password defined in the config file you created at step 1

CREATE DATABASE morgue;
CREATE USER 'morgue'@'localhost' IDENTIFIED BY 'morgue';
GRANT ALL ON morgue.* TO 'morgue'@'localhost';
SET PASSWORD FOR 'morgue'@'localhost' = PASSWORD('morgue_password');

Then add the schema to the database:

mysql -p -u morgue -h localhost morgue < schemas/postmortems.sql

Note : add any additional schemas you may use:

mysql -p -u morgue -h localhost morgue < schemas/images.sql
mysql -p -u morgue -h localhost morgue < schemas/jira.sql
mysql -p -u morgue -h localhost morgue < schemas/links.sql
mysql -p -u morgue -h localhost morgue < schemas/irc.sql

Start a development server

Using PHP built-in webserver it is possible to start quickly viewing what morgue does with the following command run from the document root.

NOTE: You may need to do some PHP setup before doing this. Follow the installation instructions here to install composer, then from your morgue base directory run php composer.phar update to install and update the necessary PHP packages.

cd htdocs
MORGUE_ENVIRONMENT=development php -d include_path=".:$(dirname `pwd`):$(dirname `pwd`)/features" -S localhost:8000

Open http://localhost:8000 to view Morgue

Configuration

Features

The configuration of individual features is maintained in an array of objects -- the 'feature' key on the configuration array.
Minimally a feature is the name of the feature and if it is "on" or not.

"features": [
    {   "name": "my_awesome_feature",
        "enabled": "on"
    }

You can add keys and values as needed for your feature. For example:

    {   "name": "my_awesome_feature",
        "enabled": "on",
        "extra_awesome_value": 11,
        "lost_numbers": [4,8,15,16,23,42]
    }

You can then access these nearly anywhere in the app.

<?php
$feature_options = Configuration::get_configuration('my_awesome_feature');
$lost_numbers = $feature_options['lost_numbers'];

A few conventions exist for features to do certain things:

  • "navbar": "on|off" Adds a link to the feature in the main navbar.
  • "custom_js_assets": ["my.js", "other.js", "http://cdn.com/external.js"] Try to load javascripts
  • "custom_css_assets": ["my.css", "other.css", "http://cdn.com/external.css"] Try to load stylesheets

Edit Page Features

If your feature involves the edit page, you'll need to list it in the edit_page_features array. The ordering of this array influences the ordering of the edit page features from first (top) to last (bottom).

   "edit_page_features": [
        "status_time", "contact", "calendar", "summary", "images"
   ]

JIRA feature

baseurl the base URL to your jira installation (use https if you are using a secured JIRA installation) username username for a user with viewing credentials password password for a user with viewing credentials additional_fields mapping of fields to display in morgue (other than key, summary, assignee, status)

    {   "name": "jira",
        "enabled": "on",
        "baseurl": "https://jira.foo.com",
        "username": "jira_morgue",
        "password": "jira_morgue",
        "additional_fields": {
            "Due Date": "duedate",
            "Some Custom Field": "customfield_1234"
        }
    },

IRC Feature

When enabled, the irc features allow the reporting of the IRC channels discussions were happening during the event. The postmortem tools tries to retrieve the list of channels in 2 ways:

  • calling the 'morgue_get_irc_channels_list' if it exits (this function is expected to return an array of strings)
  • retrieving the "channels" array from the 'irc' feature config stanza

IRC Log feature

When the IRC feature is enabled, the channels listed for a given postmortem will be clickable buttons that attempt to retrieve the IRC log history. In order to view that history in Morgue, you need to implement the irclogs endpoint. You can do so by:

  1. Create a new feature: (see below for more detail on creating a new feature)
make feature NAME=irclogs
  1. Add the new feature to your config file (in the features array)
    {   "name": "irclogs",
        "enabled": "on",
        "endpoint": "https://path.to.irseach.endpoint"
    }
  1. Implement the irclogs route

The irclogs route receives parameters in a get request. Morgue will query the irclogs endpoint with an increasing offset of 20 until it receives no data. Regardless of how you implement that endpoint, you need to return an empty response when you no longer have data to feed.

The expected response from the irclogs endpoint is a JSON array with the 3 elements: nick, time and message.

[
  {'nick':'foo','time':'10:30:03 PM', 'message':'I see foo'},
  {'nick':'bar','time':'10:35:00 PM', 'message':'Oh, I see bar'},
  {'nick':'foo','time':'10:37:34 PM', 'message':'turned out it was baz'}
]

A dummy implementation could look like (content of features/irclogs/routes.php)

<?php

/** irclog endpoint - return IRC logs paginated by 20 entries */
$app->get('/irclogs', function () use ($app) {
    header("Content-Type: application/json");
    $start_date = $app->request->get('start_date');
    $start_time = $app->request->get('start_time');
    $end_date = $app->request->get('end_date');
    $end_time = $app->request->get('end_time');
    $timezone = $app->request->get('timezone');
    $channel = $app->request->get('channel');
    $offset = $app->request->get('offset');

    if ($offset == 0) {
        $results = array(
            array('nick' => 'foo','time' => '10:55 PM', 'message' => 'bar'),
        );
    } else {
        $results = array();
    }
    echo json_encode($results);
});

Creating your own Features

Use make feature to generate a skeleton structure for your new feature.

% make feature NAME=my_new_feature
making new feature  my_new_feature
Feature directory for my_new_feature created.
Remember to add an entry to your feature config.
% tree features/my_new_feature
features/my_new_feature
├── lib.php
├── routes.php
└── views
    └── my_new_feature.php

Add it to and enable it in your config.json.

Tests

You can run the unit test suite with:

make unittests

Contribute

  1. Fork the repository
  2. Hack away
  3. Add tests so we don't accidentally break something in the future
  4. Push the branch up to GitHub (bonus points for topic branches)
  5. Send a pull request to the etsy/morgue project.

FAQ

When I visit a detail event page, I just see a "loooool"

You may have created your schemas before some features that required schema changes were added. Simply run the migration(s) commands to update your schemas:

    alter table postmortems change etsystatustime statustime int(11) UNSIGNED NOT NULL;
    alter table postmortems add column why_surprised text NOT NULL;

Or simply :

    mysql -p -u morgue -h localhost morgue < schemas/migrations/rename_statustime_column.sql
    mysql -p -u morgue -h localhost morgue < schemas/migrations/add_why_surprised_field.sql
    mysql -p -u morgue -h localhost morgue < schemas/migrations/change_text_to_longtext.sql
    mysql -p -u morgue -h localhost morgue < schemas/migrations/add_event_facilitators.sql
    mysql -p -u morgue -h localhost morgue < schemas/migrations/add_edit_locking.sql

morgue's People

Contributors

adedommelin avatar adsr avatar arnaudlimbourg avatar barrettcook avatar bgreenlee avatar cyberrodent avatar dhopkins-va avatar dveeden avatar etsy-suren avatar gpostaire avatar jacques avatar jallspaw avatar jkolberfrometsy avatar kevingessner avatar miketheman avatar mmercedes avatar mpgarate avatar mrb avatar mrtazz avatar nicksteele avatar nkammah avatar olleolleolle avatar suhussai avatar tristans 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

morgue's Issues

JavaScript errors on page load

I see these errors in the JavaScript console when I load a morgue screen:

Uncaught TypeError: Cannot read property 'createPlugin' of undefined jquery.timeentry.min.js:6
Uncaught TypeError: undefined is not a function edit.js:27

This is on Chrome.

Morgue running behind apache, per the README

Sample config should provide calendar facilitator

With a copy of the sample config I get this:

exception 'ErrorException' with message 'Undefined index: facilitator' in /home/dvaneeden/morgue/features/calendar/lib.php:12
Stack trace:

Adding a facilitator entry to the calendar in the config fixed this.

Allow images to be annotated.

Sometimes images are attached to morgue entries that may not provide enough context. It'd be nice to at least add a header above the image to describe its purpose.

Importing schemas and destroying old tables

So I was just wanted to point out that currently, the importing of schemas into the mysql database backend destroys the tables, if they exist, before creating them, as it is meant to.

My issue is that this implementation makes it difficult to create the Morgue backend when having to provision a new Morgue server while keeping the data from the old Morgue server.

So what I am wondering is, why go with this approach? Why not check if the tables to be created exist before creating them, and then skip creating them if they already exist and not destroying old data.

Configure htaccess to support caching of resources for better performance

Was looking over the .htaccess file
and thought you might consider adding something like the following to enable caching of images, css, javascript resources, etc for better client side performance.

ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/css A2592000
ExpiresByType image/svg+xml A2592000
ExpiresByType application/javascript A2592000

Related performance recommendations can be found over at Google's Page Speed Insights.

Thanks for your hard work. Morgue looks like a great project!

"What happened?" field does not appear when editing

After creating a new postmortem and then clicking to edit, the "What happened?" field does not appear for me. I don't see any obvious reason for this in Chrome Dev Tools. Images of screen and Dev Tools HTML are attached.

Thanks for any advice.

screen shot 2015-07-23 at 8 19 20 am

screen shot 2015-07-23 at 8 17 27 am

Features can't be used for authentication

In index.php the following code:

$env['admin'] = MorgueAuth::get_auth_data();

Is called before features are loaded, so the necessary auth function isn't available and morgue_user is always returned.

add on-call fields

we should have an on call (who) field in morgue so that we know who first responders were. Awesome would be a way to integrate multiple rotations and could draw information from a staff directory similar to #44

Alert the user when creating event unsuccesful

Currently, when an event fails to be saved to the database (whether it be a connection issue or some other error) morgue redirects to a 404 page. (problem lies here when event id is null.) This creates confusion as to what happened. Alerting the user that the event couldn't be saved would fix this.

Updating dates often doesn't take

In an existing postmortem, I'm trying to update the dates (start, end, detect). More often than not, the update doesn't "take", and refreshing the screen shows the old values. If I keep trying -- I've seen it happen after just trying one more time, and trying maybe 8 more times -- it'll eventually work. But there's no pattern to it.

I see no errors in the Chrome console or the apache error_log file

Show severity levels on hover

Currently, you can only view the descriptions of the severity levels by clicking on "Severity :" next to the field. This is unintuitive and hard to notice. Showing the descriptions when hovering over the field would be better.

Unable to change timezone

The Change Timezone button doesn't actually update the timezone. In htdocs/index.php there is a getUserTimezone() function. There should probably be a setUserTimezone() function as well.

Need some sort of auth tie-in

I realize this is one of those really super broad requests (and for shame without a stab at it) -- but there really does need to be some kind of LDAP auth tie-in.

Edit: Eh. I can handle this with apache now that I'm looking at #5.

Tags can't be deleted

There's a couple issues here:

  1. Tags can't be deleted.
  2. When all postmortems that define a tag are deleted, the tag sticks around.

Feature request: not-Jira / freeform remediation items

Sometimes we come up with remediation items which aren't quite Jira-ticket-shaped quite yet... usually because they'd require more brainstorming before ticketing them out.

It'd be neat to be able to record those in morgue along with the more immediate remediation items, for future reference/work. Often enough, ideas like that get lost -- but seeing them appear in multiple morgue entries could give them enough weight to move them forward.

Screenshots in the readme

It would be awesome if you could put a screenshot or 3 in the README, so that people can get a better sense of what this is all about without installing it.

Any environment requirements?

Are there PHP version requirements? MySQL requirements? The MySQL that ships with RHEL6 doesnt have support for that.

I moved to an ubuntu 12.04 machine and tried to run it and I'm running into -

PHP Parse error: syntax error, unexpected '[' in /web/morgue/phplib/Postmortem.php on line 48

(which i imagine is a php version thing, but not sure?)

Missing edit_page_features array in (example.json) config

The edit_page_features array is missing in the example.json config. Its causes that the edit view breaks after the standard option and it comes to display the features.
Took me some time to figure out how to solve this and how i have to name the features. Here is my example array:

"edit_page_features": ["tags", "status_time", "summary", "history", "images"]

I guess it's an good idea to make edit_page_features optional - so if you don't specify this in the config you get all possible edit features.

JIRA integration doesnt seem to work

I am unable to get the JIRA integration to work... I have confirmed the URL is able to curl the rest api w/ the credentials provided. Unfortunately the apps logging doesnt give me much to go on... Pretty much the only error I see is a 404 in the browsers console logs

POST /events/1/tickets HTTP/1.1
Host: morgue.int.XXXXXXX.com
Connection: keep-alive
Content-Length: 15
Cache-Control: no-cache
Pragma: no-cache
Origin: http://morgue.int.XXXXXXX.com
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Referer: http://morgue.int.XXXXXXX.com/events/1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: __qca=P0-xxxx-1378857176282; __utma=159549816.108514511.XXXX.1380727382.1382567378.18; __utmc=159549816; __utmz=159549816.1378329283.7.4.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); postmortem=X%XXXXXX%XXXXX


HTTP/1.1 404 Not Found
Server: nginx/1.4.3
Date: Thu, 31 Oct 2013 18:45:36 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 4
Connection: keep-alive
X-Powered-By: PHP/5.4.19
Set-Cookie: postmortem=1383248736%xxxxxxxxxxx%7C926cc281871ed7ea5100ff96434446504a701232; path=/; expires=Thu, 31-Oct-2013 19:45:36 UTC


Is there something more the jira integration that I am maybe missing ?

config file etc. accessible via web

The setup as described in the README leaves the config file accessible from the web. Also, the phplib etc files are similarly accessible.

eg: http://localhost:8000/config/development.json

There are a few approaches that could be taken:
a) work your web server to config to deny access to sensitive files
b) change up the file layout in the app to isolate the web-accessible stuff

I'm working on a "b" style patch.

support postrges

Would be nice to support postgres as an alternative to mysql.

Calendar on event page cannot load

After setting up a Google Calendar through the API to use to manage events, the feature appears broken on the events page. When loading an existing event, I see several errors regarding the Google API calls:

event

In the Calendar setup itself, I have substituted in the clientId, apiKey, id, and a new facilitators_email and attendees_email.

Improve styling on Anniversary page

When there aren't any anniversaries, the page simply says "Nothing broke on ..." without any styling.
This page could use an improvement. Having no anniversaries should probably look like a successful thing.

Add Pagination to Homepage

Currently, Morgue lists ALL events on the homepage. This doesn't scale well as the number of events grows. The number of events shown should be capped and "Next" and "Previous" links should be added to navigate through more events.

feature request: authentication mechanism

Is there any intention to integrate an authentication mechanism? be it mod_auth_ldap or alike? great tool, just lacking unique users so we can keep track of who is creating / editing postmortems.

Calendar event creation makes it easy to create unwanted events

I used the "Schedule a Post Mortem for this event!" link, and a calendar event was created 10 minutes in the future for a mailing list that included many attendees. This resulted in the slight embarrassment of inviting people to the wrong thing.

The time and invite list were opaque to me before using the button. I wasn't expecting the link to automatically create the event. I expected it to pre-fill some event fields that I could edit before saving and sending invitations.

I've talked to others that made the same mistake.

My suggested alternatives:

  1. Have it pre-fill a new and un-saved calendar event that can be edited before saving and sending invites
  2. Or state in the link what will happen. "Schedule a Post Mortem for {time} with {attendees}"

"Couldn't get connection object."

I've got an RHEL 6.5 server, mysql 5.5 installed via software collections, and php 5.3 installed. I've got the morgue tables created and the apache vhost seems fine. I've got a config file with the same mysql login credentials I use in a terminal.

However, when I load it in a browser, I get "Couldn't get connection object."

In httpd/error_log, I see entries such as [error] [client 10.153.92.11] Including Feature history

I'm not familiar with PHP, and so I'm unsure how to debug. Please advise.

Thanks!

Issue: "Couldn't get connection object."

Getting the following error: "Couldn't get connection object." when trying to access Morgue. Was working fine, not sure if an update has broken it or what not.

Tried updating the php-mysql module but alas did not work.

add "folks in attendance" field

From a usability standpoint probably want the ability to add people (with completion) but also allow them to click a button that says "I attended". This will have to tie into the auth method we have and also provide a way to hook into an optional staff directory listing.

Latest morgue will not run; issues PHP error

Pulling the latest morgue code, I get this when running within apache:

PHP Parse error: syntax error, unexpected '[' in /var/www/morgue/htdocs/index.php on line 301

This is with PHP 5.3.3 and Apache 2.2.15

field to capture "why we were surprised"

add fields to capture the questions:

"why we were surprised, what was learned, what was decided"

This should basically serve as a condensed version of the summary.

Typos in Readme

Several Typos in the readme file that need to be addressed. These might include some of the screen shots.

Use composer to manage dependencies in external features

Morgue has the ability to load more features than just what is bundled with the code. This is done by having php's include_path include paths to more 'feature' directories.

The challenge here is if one of those features wants to declare a dependency in composer - and the composer.json is something we're managing in the morgue repo shared all over - and not everyone using morgue will have those same external features.

We might want to expand the documentation about setting things up with an external features directory.

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.