UNPKG

backtrace-morgue

Version:

command line interface to the Backtrace object store

127 lines 52.2 kB
{ "name": "backtrace-labs/backtrace-morgue", "version": "0.1.4", "libraries": { "xv": "^1.1.25" }, "title": "", "branch": "", "style": { "name": "Default", "componentSet": { "nav": "nav/BasicNav", "header": "header/BannerHeader", "article": "article/BasicArticle", "footer": "footer/BasicFooter" }, "fontFamily": "-apple-system, BlinkMacSystemFont, sans-serif", "fontWeight": 400, "bold": 600, "lineHeight": 1.5, "typeScale": [ 72, 48, 24, 20, 16, 14, 12 ], "monospace": "Menlo, monospace", "heading": { "fontFamily": null, "fontStyle": null, "fontWeight": 600, "lineHeight": 1.25, "textTransform": null, "letterSpacing": null }, "h0": {}, "h1": {}, "h2": {}, "h3": {}, "h4": {}, "h5": {}, "h6": {}, "alternativeText": {}, "space": [ 0, 8, 16, 32, 48, 64, 96 ], "layout": { "maxWidth": 1024, "centered": false }, "colors": { "text": "#111", "background": "#fff", "primary": "#08e", "secondary": "#059", "highlight": "#e08", "border": "#ddd", "muted": "#eee" }, "border": { "width": 1, "radius": 2 }, "link": {}, "button": { "hover": { "boxShadow": "inset 0 0 0 999px rgba(0, 0, 0, .125)" } }, "input": {}, "body": { "margin": 0 }, "breakpoints": { "xs": "@media screen and (max-width:40em)", "sm": "@media screen and (min-width:40em)", "md": "@media screen and (min-width:52em)", "lg": "@media screen and (min-width:64em)" } }, "content": [ { "component": "nav", "links": [ { "href": "https://github.com/backtrace-labs/backtrace-morgue", "text": "GitHub" }, { "href": "https://npmjs.com/package/backtrace-morgue", "text": "npm" } ] }, { "component": "header", "heading": "backtrace-morgue", "subhead": "Object store client.", "children": [ { "component": "ui/TweetButton", "text": "backtrace-morgue: Object store client.", "url": null }, { "component": "ui/GithubButton", "user": "backtrace-labs", "repo": "backtrace-morgue" } ], "text": "v1.7.1" }, { "component": "article", "metadata": { "source": "github.readme" }, "html": "<h1>morgue</h1>\n<h2>Installation</h2>\n<p>It is recommended to install <code>morgue</code> using <code>npm</code>.</p>\n<pre>npm <span class=\"hljs-keyword\">install </span><span class=\"hljs-keyword\">backtrace-morgue </span>-g</pre><p>If you working from the repository, then instead use the following command.</p>\n<pre>npm <span class=\"hljs-keyword\">install</span> -g</pre><p>This will install the <code>morgue</code> tool in your configured path. Refer to the\n<code>morgue --help</code> command to learn more.</p>\n<h2>Introduction</h2>\n<p><code>morgue</code> is a command-line interface to the Backtrace object store. It allows\nyou to upload, download and issue queries on objects with-in the object store.</p>\n<h2>Usage</h2>\n<h3>login</h3>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue login <span class=\"hljs-params\">&lt;url&gt;</span></pre><p>The first step to using <code>morgue</code> is to log into a server.</p>\n<pre>$ morgue login <span class=\"hljs-string\">http:</span><span class=\"hljs-comment\">//localhost</span>\n<span class=\"hljs-string\">User:</span> sbahra\n<span class=\"hljs-string\">Password:</span> **************\n\nLogged <span class=\"hljs-keyword\">in</span>.</pre><p>At this point, you are able to issue queries.</p>\n<h3>describe</h3>\n<pre>Usage: morgue <span class=\"hljs-keyword\">describe</span> &lt;[&lt;universe&gt;/]<span class=\"hljs-keyword\">project</span>&gt; [<span class=\"hljs-keyword\">substring</span>]</pre><p>Requests a list and description of all metadata that can be queried against.</p>\n<h4>Example</h4>\n<pre>$ morgue describe bidder uname\n uname<span class=\"hljs-selector-class\">.machine</span>: machine hardware name\n uname<span class=\"hljs-selector-class\">.release</span>: kernel release\n uname<span class=\"hljs-selector-class\">.sysname</span>: kernel name\n uname<span class=\"hljs-selector-class\">.version</span>: kernel version</pre><h3>get</h3>\n<pre>Usage: morgue get &lt;<span class=\"hljs-meta\">[&lt;universe&gt;/]project&gt; [options] &lt;object id&gt; [-o &lt;output file&gt;]</span></pre><p>Downloads the specified object from the Backtrace object store and prints\nto standard output. Optionally, output the file to disk.</p>\n<p>The following options are available:</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>--resource=name</code></td>\n<td>Fetch the specified resource rather than the object.</td>\n</tr>\n</tbody>\n</table>\n<h3>put</h3>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue put <span class=\"hljs-params\">&lt;[&lt;universe&gt;</span>/]project&gt; <span class=\"hljs-params\">&lt;file&gt;</span> <span class=\"hljs-params\">&lt;--format=btt|minidump|json|symbols&gt;</span> [options]</pre><p>Uploads object file to the Backtrace object store. User has the following options</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>`--compression=gzip</td>\n<td>deflate`</td>\n<td>uploaded file is compressed</td>\n</tr>\n<tr>\n<td><code>--kv=key1:value1,key2:value2,...</code></td>\n<td>upload key-values</td>\n</tr>\n<tr>\n<td><code>--form_data</code></td>\n<td>upload file by multipart/form-data post request</td>\n</tr>\n</tbody>\n</table>\n<h3>modify</h3>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue modify <span class=\"hljs-params\">&lt;[universe/]project&gt;</span> (<span class=\"hljs-params\">&lt;query&gt;</span>|<span class=\"hljs-params\">&lt;object&gt;</span> ...) [--set ...] [--clear ...]</pre><p>Modifies attributes of the given object in the manner specified.\nBoth options below may be specified more than once.</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>--set</code></td>\n<td>Set the given <code>attribute=value</code> pair</td>\n</tr>\n<tr>\n<td><code>--clear</code></td>\n<td>Clear the given <code>attribute</code></td>\n</tr>\n</tbody>\n</table>\n<p>You are also able to modify multiple objects by specifying filters. The\n<code>--filter</code>, <code>--age</code> and <code>--time</code> arguments are accepted to modify.</p>\n<h4>Example</h4>\n<p>Set hostname to <code>fqdn.example.com</code> for object identifier 0.</p>\n<pre><span class=\"hljs-symbol\">$</span> morgue modify --<span class=\"hljs-keyword\">set</span> hostname=fqdn.example.com <span class=\"hljs-comment\">myproject 0</span></pre><p>Set custom attribute <code>reason</code> to <code>oom</code> for all crashes containing <code>memory_abort</code>.</p>\n<pre><span class=\"hljs-symbol\">$</span> morgue modify --<span class=\"hljs-keyword\">set</span> reason=oom <span class=\"hljs-comment\">--filter=callstack,regular-expression,memory_abort</span></pre><h3>attachment</h3>\n<pre>Usage: morgue attachment &lt;<span class=\"hljs-built_in\">add</span>|<span class=\"hljs-built_in\">get</span>|<span class=\"hljs-keyword\">list</span>|<span class=\"hljs-keyword\">delete</span>&gt; ...\n\n morgue attachment <span class=\"hljs-built_in\">add</span> [<span class=\"hljs-keyword\">options</span>] &lt;[universe/]project&gt; <span class=\"hljs-symbol\">&lt;oid&gt;</span> <span class=\"hljs-symbol\">&lt;filename&gt;</span>\n\n --content-<span class=\"hljs-built_in\">type</span>=CT Specify Content-Type <span class=\"hljs-keyword\">for</span> attachment.\n The server may auto-detect this.\n --attachment-name=<span class=\"hljs-keyword\">N</span> Use this name <span class=\"hljs-keyword\">for</span> the attachment name.\n Default <span class=\"hljs-keyword\">is</span> the same <span class=\"hljs-keyword\">as</span> the filename.\n\n morgue attachment <span class=\"hljs-built_in\">get</span> [<span class=\"hljs-keyword\">options</span>] &lt;[universe/]project&gt; <span class=\"hljs-symbol\">&lt;oid&gt;</span>\n\n Must specify one of:\n --attachment-id=ID Attachment ID <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">delete</span>.\n --attachment-name=<span class=\"hljs-keyword\">N</span> Attachment name <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">delete</span>.\n\n morgue attachment <span class=\"hljs-keyword\">list</span> [<span class=\"hljs-keyword\">options</span>] &lt;[universe/]project&gt; <span class=\"hljs-symbol\">&lt;oid&gt;</span>\n\n morgue attachment <span class=\"hljs-keyword\">delete</span> [<span class=\"hljs-keyword\">options</span>] &lt;[universe/]project <span class=\"hljs-symbol\">&lt;oid&gt;</span>\n\n Must specify one of:\n --attachment-id=ID Attachment ID <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">delete</span>.\n --attachment-name=<span class=\"hljs-keyword\">N</span> Attachment name <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">delete</span>.</pre><p>Manage attachments associated with an object.</p>\n<h3>list</h3>\n<p>Allows you to perform queries on object metadata. You can perform\neither selection queries or aggregation queries, but not both at the\nsame time.</p>\n<pre>Usage: morgue list &lt;<span class=\"hljs-string\">[&lt;universe&gt;/]</span>project&gt; <span class=\"hljs-string\">[substring]</span></pre><p>You may pass <code>--verbose</code> in order to get more detailed query performance\ndata.</p>\n<h4>Filters</h4>\n<p>The filter option expects a comma-delimited list of the form\n<code>&lt;attribute&gt;,&lt;operation&gt;,&lt;value&gt;</code>.</p>\n<p>The currently supported operations are <code>equal</code>, <code>regular-expression</code>,\n<code>inverse-regular-expression</code>, <code>at-least</code>, <code>greater-than</code>, <code>at-most</code>,\n<code>less-than</code>, <code>contains</code>, <code>not-contains</code>, <code>is-set</code>, and <code>is-not-set</code>.</p>\n<h4>Pagination</h4>\n<p>Pagination is handled with two flags</p>\n<p><code>--limit=&lt;n&gt;</code> controls the number of returned rows. <code>--offset=&lt;n&gt;</code> controls the\noffset at which rows are returned, another way to put it is that it skips the\nfirst <code>&lt;n&gt;</code> rows.</p>\n<h4>Aggregations</h4>\n<p>Aggregation is expressed through a myriad of command-line options that express\ndifferent aggregation operations. Options are of form <code>--&lt;option&gt;=&lt;attribute&gt;</code>.</p>\n<p>The <code>*</code> factor is used when aggregations are performed when no factor is\nspecified or if an object does not have a valid value associated with the\nfactor.</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>--age</code></td>\n<td>Specify a relative timestamp to now. <code>1h</code> ago, or <code>1d</code> ago.</td>\n</tr>\n<tr>\n<td><code>--time</code></td>\n<td>Specify a range using <a href=\"https://github.com/wanasit/chrono#readme\">Chrono</a>.</td>\n</tr>\n<tr>\n<td><code>--unique</code></td>\n<td>provide a count of distinct values</td>\n</tr>\n<tr>\n<td><code>--histogram</code></td>\n<td>provide all distinct values</td>\n</tr>\n<tr>\n<td><code>--distribution</code></td>\n<td>provide a truncated histogram</td>\n</tr>\n<tr>\n<td><code>--mean</code></td>\n<td>calculate the mean of a column</td>\n</tr>\n<tr>\n<td><code>--sum</code></td>\n<td>sum all values</td>\n</tr>\n<tr>\n<td><code>--range</code></td>\n<td>provide the minimum and maximum values</td>\n</tr>\n<tr>\n<td><code>--count</code></td>\n<td>count all non-null values</td>\n</tr>\n<tr>\n<td><code>--bin</code></td>\n<td>provide a linear histogram of values</td>\n</tr>\n<tr>\n<td><code>--head</code></td>\n<td>provide the first value in a factor</td>\n</tr>\n<tr>\n<td><code>--tail</code></td>\n<td>provide the last value in a factor</td>\n</tr>\n<tr>\n<td><code>--object</code></td>\n<td>provide the maximum object identifier of a column</td>\n</tr>\n</tbody>\n</table>\n<h4>Sorting</h4>\n<p>Sorting of results is done with the stackable option <code>--sort=&lt;term&gt;</code>. The term\nsyntax is <code>[-](&lt;column&gt;|&lt;fold_term&gt;)</code>.</p>\n<ul>\n<li>The optional <code>-</code> reverse the sort term order to descending, otherwise it\ndefaults to ascending.</li>\n<li>The <code>&lt;column&gt;</code> term refers to a valid column in the table. This is only\neffective for selection type query, i.e. when using the <code>--select</code> option.</li>\n<li>The <code>&lt;fold_term&gt;</code> is an expression pointing to a fold operation. The\nexpression language for fold operation is one of the following literal:<ul>\n<li><code>;group</code>: sort by the group key itself.</li>\n<li><code>;count</code>: sort by the group count (number of crashes).</li>\n<li><code>column;idx</code>: where <code>column</code> is a string referencing a column in the fold\ndictionary and <code>idx</code> is an indice in the array. See examples .</li>\n</ul>\n</li>\n</ul>\n<p>Multiple sort terms can be provided to break ties in case the previous\nreferenced sort term has ties.</p>\n<h4>Example</h4>\n<p>Request all faults from application deployments owned by jdoe.\nProvide the timestamp, hostname, callstack and classifiers.</p>\n<pre>$ morgue list <span class=\"hljs-keyword\">bidder </span>--filter<span class=\"hljs-symbol\">=tag_owner</span>,equal,jdoe --<span class=\"hljs-keyword\">select=timestamp </span>--<span class=\"hljs-keyword\">select=hostname </span>--<span class=\"hljs-keyword\">select=callstack </span>--<span class=\"hljs-keyword\">select=classifiers\n</span>*\n<span class=\"hljs-number\">#9</span>d33 Thu Oct <span class=\"hljs-number\">13</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">18</span>:<span class=\"hljs-number\">36</span>:<span class=\"hljs-number\">01</span> GMT-<span class=\"hljs-number\">0400</span> (EDT) <span class=\"hljs-number\">5</span> months ago\n<span class=\"hljs-symbol\"> hostname:</span> <span class=\"hljs-number\">2235</span>.<span class=\"hljs-keyword\">bm-bidderc.prod.nym2\n</span><span class=\"hljs-symbol\"> classifiers:</span> abort stop\n<span class=\"hljs-symbol\"> callstack:</span>\n <span class=\"hljs-meta\">assert</span> &#x2190; int_set_union_all &#x2190; all_domain_lists &#x2190;\n setup_phase_unlocked &#x2190; <span class=\"hljs-keyword\">bid_handler_slave_inner </span>&#x2190; <span class=\"hljs-keyword\">bid_handler_slave </span>&#x2190;\n an_sched_process_task &#x2190; an_sched_slave &#x2190; event_base_loop &#x2190;\n an_sched_enter &#x2190; <span class=\"hljs-keyword\">bidder_slave </span>&#x2190; an_sched_pthread_cb\n<span class=\"hljs-symbol\">#ef2f</span> Thu Oct <span class=\"hljs-number\">13</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">18</span>:<span class=\"hljs-number\">36</span>:<span class=\"hljs-number\">01</span> GMT-<span class=\"hljs-number\">0400</span> (EDT) <span class=\"hljs-number\">5</span> months ago\n<span class=\"hljs-symbol\"> hostname:</span> <span class=\"hljs-number\">2066</span>.<span class=\"hljs-keyword\">bm-impbus.prod.nym2\n</span><span class=\"hljs-symbol\"> classifiers:</span> abort stop\n<span class=\"hljs-symbol\"> callstack:</span>\n <span class=\"hljs-meta\">assert</span> &#x2190; an_discovery_get_instances &#x2190; <span class=\"hljs-keyword\">budget_init_discovery </span>&#x2190;\n main\n<span class=\"hljs-number\">#119</span>bf Thu Oct <span class=\"hljs-number\">13</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">18</span>:<span class=\"hljs-number\">36</span>:<span class=\"hljs-number\">01</span> GMT-<span class=\"hljs-number\">0400</span> (EDT) <span class=\"hljs-number\">5</span> months ago\n<span class=\"hljs-symbol\"> hostname:</span> <span class=\"hljs-number\">2066</span>.<span class=\"hljs-keyword\">bm-impbus.prod.nym2\n</span><span class=\"hljs-symbol\"> classifiers:</span> abort stop\n<span class=\"hljs-symbol\"> callstack:</span>\n <span class=\"hljs-meta\">assert</span> &#x2190; an_discovery_get_instances &#x2190; <span class=\"hljs-keyword\">budget_init_discovery </span>&#x2190;\n main</pre><p>Request faults owned by jdoe, group them by fingerprint and aggregate\nthe number of unique hosts, display a histogram of affected versions and\nprovide a linear histogram of process age distribution.</p>\n<pre>$ morgue list <span class=\"hljs-keyword\">bidder </span>--age<span class=\"hljs-number\">=1</span>y --factor<span class=\"hljs-symbol\">=fingerprint</span> --filter<span class=\"hljs-symbol\">=tag_owner</span>,equal,jdoe --head<span class=\"hljs-symbol\">=callstack</span> --unique<span class=\"hljs-symbol\">=hostname</span> --histogram<span class=\"hljs-symbol\">=tag</span> --<span class=\"hljs-keyword\">bin=process.age\n</span><span class=\"hljs-number\">823</span>a55fb15bf697ba3041d736ade... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">5</span> months ago\n<span class=\"hljs-symbol\">Date</span>: Wed May <span class=\"hljs-number\">18</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">18</span>:<span class=\"hljs-number\">44</span>:<span class=\"hljs-number\">35</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n<span class=\"hljs-symbol\">callstack</span>:\n <span class=\"hljs-meta\">assert</span> &#x2190; int_set_union_all &#x2190; all_domain_lists &#x2190;\n setup_phase_unlocked &#x2190; <span class=\"hljs-keyword\">bid_handler_slave_inner </span>&#x2190; <span class=\"hljs-keyword\">bid_handler_slave </span>&#x2190;\n an_sched_process_task &#x2190; an_sched_slave &#x2190; event_base_loop &#x2190;\n an_sched_enter &#x2190; <span class=\"hljs-keyword\">bidder_slave </span>&#x2190; an_sched_pthread_cb\n<span class=\"hljs-symbol\">histogram</span>(tag):\n <span class=\"hljs-number\">8</span>.<span class=\"hljs-number\">20</span>.<span class=\"hljs-number\">4</span>.<span class=\"hljs-keyword\">adc783.0 </span>&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586; <span class=\"hljs-number\">1</span>\n<span class=\"hljs-symbol\">unique</span>(hostname): <span class=\"hljs-number\">1</span>\n<span class=\"hljs-keyword\">bin(process.age):\n</span> <span class=\"hljs-number\">7731</span> <span class=\"hljs-number\">7732</span> &#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586; <span class=\"hljs-number\">1</span>\n\n<span class=\"hljs-number\">3</span>b851ac1ab1421409159cc38edb2... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">5</span> months ago\n<span class=\"hljs-symbol\">Date</span>: Tue May <span class=\"hljs-number\">17</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">17</span>:<span class=\"hljs-number\">28</span>:<span class=\"hljs-number\">26</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Tue May <span class=\"hljs-number\">17</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">17</span>:<span class=\"hljs-number\">30</span>:<span class=\"hljs-number\">07</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n<span class=\"hljs-symbol\">callstack</span>:\n <span class=\"hljs-meta\">assert</span> &#x2190; an_discovery_get_instances &#x2190; <span class=\"hljs-keyword\">budget_init_discovery </span>&#x2190;\n main\n<span class=\"hljs-symbol\">histogram</span>(tag):\n <span class=\"hljs-number\">4</span>.<span class=\"hljs-number\">44</span>.<span class=\"hljs-number\">0</span>.<span class=\"hljs-keyword\">adc783.1 </span>&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586; <span class=\"hljs-number\">2</span>\n<span class=\"hljs-symbol\">unique</span>(hostname): <span class=\"hljs-number\">1</span>\n<span class=\"hljs-keyword\">bin(process.age):\n</span> <span class=\"hljs-number\">23</span> <span class=\"hljs-number\">24</span> &#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586; <span class=\"hljs-number\">1</span>\n <span class=\"hljs-number\">24</span> <span class=\"hljs-number\">25</span> &#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586;&#x2586; <span class=\"hljs-number\">1</span></pre><p>Request faults for the last 2 years, group them by fingerprint, show the first\nobject identifier in the group, sort the results by descending fingerprint,\nlimit the results to 5 faults and skip the first 10 (according to sort order).</p>\n<pre>$ morgue list blackhole --age=<span class=\"hljs-number\">2</span>y --factor=fingerprint --object=fingerprint --limit=<span class=\"hljs-number\">5</span> --offset=<span class=\"hljs-number\">10</span> --sort=<span class=\"hljs-string\">&quot;-;group&quot;</span>\nfec4bfecf8e077cf44024f5668fa... &#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">2</span> years ago\nFirst Occurrence: Tue Jan <span class=\"hljs-number\">12</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">13</span>:<span class=\"hljs-number\">30</span>:<span class=\"hljs-number\">12</span> GMT-<span class=\"hljs-number\">0500</span> (EST)\n Occurrences: <span class=\"hljs-number\">360</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">object</span><span class=\"hljs-params\">(fingerprint)</span></span>: <span class=\"hljs-number\">1</span>c653d\n\nfe7294a780a16e30b619e8d94a8a... &#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">2</span> years ago\nFirst Occurrence: Wed Oct <span class=\"hljs-number\">28</span> <span class=\"hljs-number\">2015</span> <span class=\"hljs-number\">11</span>:<span class=\"hljs-number\">30</span>:<span class=\"hljs-number\">47</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Last Occurrence: Wed Oct <span class=\"hljs-number\">28</span> <span class=\"hljs-number\">2015</span> <span class=\"hljs-number\">12</span>:<span class=\"hljs-number\">16</span>:<span class=\"hljs-number\">19</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">203</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">object</span><span class=\"hljs-params\">(fingerprint)</span></span>: <span class=\"hljs-number\">1</span>c23b3\n\nfe5e0dda6cf0fb996a521dde4087... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">1</span> year ago\nFirst Occurrence: Tue Jun <span class=\"hljs-number\">14</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">11</span>:<span class=\"hljs-number\">54</span>:<span class=\"hljs-number\">35</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">object</span><span class=\"hljs-params\">(fingerprint)</span></span>: <span class=\"hljs-number\">2</span>de5\n\nfe46d9af7c65c084091fed51ef02... &#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">2</span> years ago\nFirst Occurrence: Tue Oct <span class=\"hljs-number\">27</span> <span class=\"hljs-number\">2015</span> <span class=\"hljs-number\">16</span>:<span class=\"hljs-number\">59</span>:<span class=\"hljs-number\">34</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Last Occurrence: Tue Oct <span class=\"hljs-number\">27</span> <span class=\"hljs-number\">2015</span> <span class=\"hljs-number\">20</span>:<span class=\"hljs-number\">05</span>:<span class=\"hljs-number\">30</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">3</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">object</span><span class=\"hljs-params\">(fingerprint)</span></span>: <span class=\"hljs-number\">8</span>f41\n\nfdc0860ef6dfd3d0397b53043ab9... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">1</span> year ago\nFirst Occurrence: Tue Jun <span class=\"hljs-number\">07</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">11</span>:<span class=\"hljs-number\">51</span>:<span class=\"hljs-number\">55</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">211</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">object</span><span class=\"hljs-params\">(fingerprint)</span></span>: <span class=\"hljs-number\">1</span>c1958</pre><p>Request faults for the two years, group them by fingerprint, sum process.age,\nsort the results by descending sum of process.age per fingerprint, limit the\nresults to 3 faults. Note here that <code>1</code> in <code>-process.age;1</code> is the second\noperator (<code>--sum</code>) in this case.</p>\n<pre>$ morgue list blackhole --age=<span class=\"hljs-number\">2</span>y --factor=fingerprint --first=process<span class=\"hljs-selector-class\">.age</span> --sum=process<span class=\"hljs-selector-class\">.age</span> --limit=<span class=\"hljs-number\">3</span> --sort=<span class=\"hljs-string\">&quot;-process.age;1&quot;</span>\nd9358a6fdb7eaa143254b6987d00... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">1</span> year ago\nFirst Occurrence: Tue Sep <span class=\"hljs-number\">20</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">59</span>:<span class=\"hljs-number\">46</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Last Occurrence: Tue Sep <span class=\"hljs-number\">20</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">22</span>:<span class=\"hljs-number\">03</span>:<span class=\"hljs-number\">23</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">38586</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">sum</span><span class=\"hljs-params\">(process.age)</span></span>: <span class=\"hljs-number\">56892098354615</span> sec\n\n<span class=\"hljs-number\">524</span>b9f988c8ff9dfc1b3a0c71231... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">1</span> year ago\nFirst Occurrence: Tue Sep <span class=\"hljs-number\">20</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">22</span>:<span class=\"hljs-number\">01</span>:<span class=\"hljs-number\">52</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Last Occurrence: Tue Sep <span class=\"hljs-number\">20</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">22</span>:<span class=\"hljs-number\">03</span>:<span class=\"hljs-number\">19</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">25737</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">sum</span><span class=\"hljs-params\">(process.age)</span></span>: <span class=\"hljs-number\">37947233900547</span> sec\n\nbffd05c6b745229fd1c648bbe2a7... &#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2588;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581;&#x2581; <span class=\"hljs-number\">1</span> year ago\nFirst Occurrence: Tue Sep <span class=\"hljs-number\">20</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">21</span>:<span class=\"hljs-number\">59</span>:<span class=\"hljs-number\">46</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Last Occurrence: Tue Sep <span class=\"hljs-number\">20</span> <span class=\"hljs-number\">2016</span> <span class=\"hljs-number\">22</span>:<span class=\"hljs-number\">03</span>:<span class=\"hljs-number\">01</span> GMT-<span class=\"hljs-number\">0400</span> (EDT)\n Occurrences: <span class=\"hljs-number\">20096</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">sum</span><span class=\"hljs-params\">(process.age)</span></span>: <span class=\"hljs-number\">29630010305216</span> sec</pre><h3>delete</h3>\n<p>Allows deleting objects.</p>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue delete <span class=\"hljs-params\">&lt;[universe/]project&gt;</span> <span class=\"hljs-params\">&lt;oid1&gt;</span> [... oidN]</pre><p>Object IDs must be specified; they can be found in <code>morgue list</code> output.\nThe object ID printed in the example above is <code>9d33</code>.</p>\n<p>The following options support partial deletes:\n<code>--physical-only</code>: Only delete the physical object; retain indexing.\n<code>--crdb-only</code>: Only delete the indexed data; requires physically deleted objects.</p>\n<h3>flamegraph</h3>\n<pre>Usage: morgue flamegraph <span class=\"hljs-string\">[--filter=&lt;filter expression&gt;]</span> <span class=\"hljs-string\">[--reverse]</span> <span class=\"hljs-string\">[--unique]</span> <span class=\"hljs-string\">[-o file.svg]</span></pre><p>Generate a flamegraph of callstacks of all objects matching the specified\nfilter criteria. The <code>--filter</code> option behaves identically to the <code>list</code>\nsub-command. This functionality requires <code>perl</code> to be installed.\nTo learn more about flamegraphs, please see\n<a href=\"http://www.brendangregg.com/flamegraphs.html\">http://www.brendangregg.com/flamegraphs.html</a>.</p>\n<p>Use <code>--unique</code> to only sample unique crashes. Use <code>--reverse</code> to begin sampling\nfrom leaf functions.</p>\n<h3>report</h3>\n<p>Create and manage scheduled reports.</p>\n<pre>Usage: morgue report &lt;list | <span class=\"hljs-built_in\">create</span> | <span class=\"hljs-built_in\">delete</span> | <span class=\"hljs-built_in\">send</span>&gt; [<span class=\"hljs-comment\">--project=...] [--universe=...]</span></pre><h4>create</h4>\n<pre>Usage: morgue report &lt;project&gt; create\n &lt;--rcpt=...&gt;\n &lt;--title=...&gt;\n [--filter=...]\n [--fingerprint=...]\n [--histogram=...]\n [--hour=...]\n [--day=...]\n --period=&lt;week | day&gt;</pre><p>Example:</p>\n<pre>$ morgue report MyProject create --rcpt=<span class=\"hljs-literal\">null</span><span class=\"hljs-meta\">@backtrace</span>.io\n --rcpt=<span class=\"hljs-keyword\">list</span><span class=\"hljs-meta\">@backtrace</span>.io --<span class=\"hljs-keyword\">filter</span>=environment,equal,prod\n --title=<span class=\"hljs-string\">&quot;Production Crashes weekly&quot;</span> --period=week</pre><h4>delete</h4>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue report <span class=\"hljs-params\">&lt;project&gt;</span> delete <span class=\"hljs-params\">&lt;report integer identifier&gt;</span></pre><h4>list</h4>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue report <span class=\"hljs-params\">&lt;project&gt;</span> list</pre><h3>repair</h3>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue repair <span class=\"hljs-params\">&lt;[universe/]project&gt;</span></pre><p>Repair a project&apos;s attribute database. For each corrupted pages of a project&apos;s\nattribute database, reprocess the affected objects (if possible). Once\ncompleted and successful, transition the database into normal mode.</p>\n<h3>reprocess</h3>\n<pre>Usage: morgue reprocess &lt;[universe/]project&gt; [<span class=\"hljs-symbol\">&lt;query&gt;</span>|<span class=\"hljs-symbol\">&lt;object&gt;</span> ...] [--<span class=\"hljs-keyword\">first</span> <span class=\"hljs-keyword\">N</span>] [--<span class=\"hljs-keyword\">last</span> <span class=\"hljs-keyword\">N</span>]\n\nOptions <span class=\"hljs-keyword\">for</span> reproces<span class=\"hljs-variable\">s:</span>\n --<span class=\"hljs-keyword\">first</span>=<span class=\"hljs-keyword\">N</span> Specify the <span class=\"hljs-keyword\">first</span> object ID (defaul<span class=\"hljs-variable\">t:</span> earliest known)\n --<span class=\"hljs-keyword\">last</span>=<span class=\"hljs-keyword\">N</span> Specify the <span class=\"hljs-keyword\">last</span> object ID (defaul<span class=\"hljs-variable\">t:</span> most recent known)</pre><p>Reprocess the project&apos;s objects. This command can be used to re-execute\nindexing, fingerprinting, and symbolification (where needed).</p>\n<p>If a set of objects (or query) is specified, any values for <code>--first</code> and\n<code>--last</code> are replaced to match the object list. If no query, object list,\nor range is provided, all objects in the project are reprocessed.</p>\n<h3>retention</h3>\n<pre>Usage: morgue retention &lt;<span class=\"hljs-built_in\">list</span>|<span class=\"hljs-built_in\">set</span>|status|clear&gt; &lt;<span class=\"hljs-built_in\">name</span>&gt; [options]\n\nOptions <span class=\"hljs-keyword\">for</span> <span class=\"hljs-built_in\">set</span>/clear:\n --<span class=\"hljs-built_in\">type</span>=T Specify retention <span class=\"hljs-built_in\">type</span> (<span class=\"hljs-keyword\">default</span>: project)\n valid: instance, universe, project\n\nOptions <span class=\"hljs-keyword\">for</span> status:\n [--<span class=\"hljs-built_in\">type</span>=&lt;universe|project&gt; &lt;<span class=\"hljs-built_in\">name</span>&gt;]\n\nOptions <span class=\"hljs-keyword\">for</span> <span class=\"hljs-built_in\">set</span>:\n --<span class=\"hljs-built_in\">max</span>-age=N Specify <span class=\"hljs-built_in\">time</span> limit <span class=\"hljs-keyword\">for</span> objects, <span class=\"hljs-built_in\">in</span> seconds\n --physical-only Specifies that the policy only delete physical copies;\n indexing will be retained.</pre><p>Configure the retention policy for a given namespace, which can cover the\ncoroner instance, or a specific universe or project.</p>\n<h4>Example</h4>\n<pre>$ morgue retention clear a_project\n<span class=\"hljs-keyword\">success\n</span>$ morgue retention set blackhole --max-age=3600\n$ morgue retention list\nProject-level:\n blackhole: max age: 1h\n$</pre><h3>sampling</h3>\n<pre><span class=\"hljs-attribute\">Usage</span>: morgue sampling &lt;status|reset&gt; [options]\n\n<span class=\"vim\">Options <span class=\"hljs-keyword\">for</span> either status <span class=\"hljs-built_in\">or</span> rese<span class=\"hljs-variable\">t:</span>\n --fingerprint=group Specify <span class=\"hljs-keyword\">a</span> fingerprint <span class=\"hljs-keyword\">to</span> apply <span class=\"hljs-keyword\">to</span>.\n Without this, applies <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">all</span>.\n --project=[universe/]project Specify <span class=\"hljs-keyword\">a</span> project <span class=\"hljs-keyword\">to</span> apply <span class=\"hljs-keyword\">to</span>.\n Without this, applies <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">all</span>.\n\nOptions <span class=\"hljs-keyword\">for</span> status <span class=\"hljs-keyword\">only</span>:\n --<span class=\"hljs-built_in\">max</span>-groups=<span class=\"hljs-keyword\">N</span> Specify <span class=\"hljs-built_in\">max</span> <span class=\"hljs-keyword\">number</span> of groups <span class=\"hljs-keyword\">to</span> <span class=\"hljs-keyword\">display</span>\n per project.</span></pre><p>Retrieve the object sampling status, or reset it.\nProject is a required flag if fingerprint is specified.</p>\n<h3>symbol</h3>\n<pre>Usage: morgue symbol &lt;<span class=\"hljs-meta\">[&lt;universe&gt;/]project&gt; [summary | list | missing | archives] [-o &lt;output file&gt;]</span></pre><p>Retrieve a list of uploaded symbols or symbol archives. By default, <code>morgue symbol</code>\nwill return a summary of uploaded archives, available symbols and missing symbols.\nIf <code>archives</code> is used, a list of uploaded, in-process and symbol processing errors\nare outputted. If <code>list</code> is used, then a list of uploaded symbols is returned. If\n<code>missing</code> is used, then the set of missing symbols for the project are included.</p>\n<h3>scrubber</h3>\n<p>Create, modify and delete data scrubbers.</p>\n<pre>Usage: morgue scrubber &lt;project&gt; &lt;list | <span class=\"hljs-type\">create</span> | <span class=\"hljs-type\">modify</span> | <span class=\"hljs-type\">delete</span>&gt;</pre><p>Use <code>--name</code> to identify the scrubber. Use <code>--regexp</code> to specify the pattern to\nmatch and scrub. Use <code>--builtin</code> to specify a builtin scrubber, <code>ssn</code>, <code>ccn</code>,\n<code>key</code> and <code>env</code> are currently supported for social security number, credit card\nnumber, encryption key and environment variable. If <code>--builtin=all</code> in <code>create</code>\nsubcommand, all supported builtin scrubbers are created. <code>--regexp</code> and\n<code>--builtin</code> are mutually exclusive. Use <code>--enable</code> to activate the scrubber, 0\ndisables the scrubber while other integer values enable it.</p>\n<h3>setup</h3>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue setup <span class=\"hljs-params\">&lt;url&gt;</span></pre><p>If you are using an on-premise version of <code>coronerd</code>, use <code>morgue setup</code>\nto configure the initial organization and user. For example, if the server is\n<code>backtrace.mycompany.com</code>, then you would run <code>morgue setup http://backtrace.mycompany.com</code>.\nWe recommend resetting your password after you enable SSL (done by configuring\nyour certificates).</p>\n<h3>nuke</h3>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue nuke --universe=<span class=\"hljs-params\">&lt;universe name&gt;</span> [--project=<span class=\"hljs-params\">&lt;project name&gt;</span>]</pre><p>If you want to nuke an object and all of the dependencies of the object.\nDo not use this operation without making a back-up of your data.</p>\n<h3>token</h3>\n<pre>Usage: morgue <span class=\"hljs-keyword\">token</span> [<span class=\"hljs-built_in\">create</span> | list | <span class=\"hljs-built_in\">delete</span>] [<span class=\"hljs-comment\">--project=...] [--universe=...]</span></pre><h4>create</h4>\n<pre><span class=\"hljs-symbol\">Usage:</span> morgue token create --project=<span class=\"hljs-params\">&lt;project&gt;</span> --capability=<span class=\"hljs-params\">&lt;capability&gt;</span></pre><p>Capability can be any of:</p>\n<ul>\n<li>symbol:post - Enable symbol uploads with the specified API token.</li>\n<li>error:post - Enable error and dump submission with the specified API token.</li>\n<li>query:post - Enable queries to be issued using the specified token.</li>\n<li>sync:post - Allow for slower but more verbose submission.</li>\n</ul>\n<p>Multiple capabilities can be specified by using <code>--capability</code> multiple times\nor using a comma-separated list.</p>\n<h4>list</h4>\n<pre>Usage: morgue token <span class=\"hljs-built_in\">list</span> <span class=\"hljs-meta\">[</span>-<span class=\"hljs-params\">-universe</span>=<span class=\"hljs-params\">...</span><span class=\"hljs-meta\">]</span> <span class=\"hljs-meta\">[</span>-<span class=\"hljs-params\">-project</span>=<span class=\"hljs-params\">...</span><span class=\"hljs-meta\">]</span></pre><p>List API tokens in the specified universe, for all projects or a specified\nproject.</p>\n<h4>delete</h4>\n<pre>Usage: morgue <span class=\"hljs-built_in\">token</span> <span class=\"hljs-keyword\">delete</span> &lt;sha256 <span class=\"hljs-keyword\">or</span> prefix&gt;</pre><p>Delete the specified token by substring or exact match.</p>\n<h3>user</h3>\n<pre>Usage: morgue user reset <span class=\"hljs-string\">[--universe=...]</span> <span class=\"hljs-string\">[--user=...]</span> <span class=\"hljs-string\">[--password=...]</span></pre><p>Modify users.</p>\n<p>Currently, can only be used to reset user passwords. Prompts for user and\npassword if either is not specified.</p>\n<h3>tenant</h3>\n<p>Create isolated tenants for receiving error data and log in. Tenants provide\nnamespace isolation. Users in one tenant are unable to interact with any\nobjects outside of their tenant.</p>\n<p>This is an enterprise feature and not enabled by default for self-serve\ncustomers. The tenant commands require superuser access.</p>\n<pre>Usage: morgue tenant &lt;list | <span class=\"hljs-built_in\">create</span> | <span class=\"hljs-built_in\">delete</span>&gt;\n <span class=\"hljs-built_in\">create</span> &lt;name&gt;: Create <span class=\"hljs-keyword\">a</span> tenant <span class=\"hljs-keyword\">with</span> <span class=\"hljs-keyword\">the</span> specified name.\n <span class=\"hljs-built_in\">delete</span> &lt;name&gt;: Delete <span class=\"hljs-keyword\">a</span> tenant <span class=\"hljs-keyword\">with</span> <span class=\"hljs-keyword\">the</span> specified name.\n list: List all tenants <span class=\"hljs-keyword\">on</span> <span class=\"hljs-title\">your</span> <span class=\"hljs-title\">instance</span>.</pre><h4>Examples</h4>\n<p>1.0 Create a Tenant</p>\n<p>After logging into an object store as a superuser, we are able to simply\ncreate a tenant using the following command:</p>\n<pre>$ morgue tenant <span class=\"hljs-built_in\">create</span> testingxyz\nTenant successfully created <span class=\"hljs-keyword\">at</span> <span class=\"hljs-keyword\">https</span>://testingxyz.sp.backtrace.io\nWait <span class=\"hljs-keyword\">a</span> few minutes <span class=\"hljs-keyword\">for</span> propagation <span class=\"hljs-built_in\">to</span> complete.</pre><p>Tenants are required to be contained with-in the same TLD. For example,\na tenant of name <code>X</code> is expected to be contained in <code>X.sp.backtrace.io</code>.</p>\n<p>After creating a tenant, you will probably need to invite an initial\nadministrator user for the tenant. For that, please see <code>invite</code> sub-command\nlisted below. You must use the <code>--tenant</code> option to invite an administrator\nto a particular tenant.</p>\n<p>2.0 Delete a Tenant</p>\n<p>After logging into an object store as a superuser, we are able to simply\ncreate a tenant using the following command:</p>\n<pre>$ morgue tenant <span class=\"hljs-keyword\">delete</span> testingxyz\nTenant successfully deleted.</pre><p>Please note this is a destructive command from a configuration perspective.\nUnless you are maintaining backups, there is no way to restore your\nconfiguration data.</p>\n<p>3.0 List Tenants</p>\n<p>You can list existing tenants using the <code>morgue tenant list</code> command\nas below.</p>\n<pre>$ morgue tenant <span class=\"hljs-keyword\">list</span>\n ID Tenant URL\n <span class=\"hljs-number\">1</span> test http<span class=\"hljs-variable\">s:</span>//test.<span class=\"hljs-keyword\">sp</span>.backtrace.io\n <span class=\"hljs-number\">4</span> test1 http<span class=\"hljs-variable\">s:</span>//test1.<span class=\"hljs-keyword\">sp</span>.backtrace.io</pre><h3>similarity</h3>\n<p>Compute the similarity and list acceptably similar crash groups according\nto their callstack attribute.</p>\n<pre>Usage: morgue similarity &lt;[universe]/project&gt; [filter expression]\n [<span class=\"hljs-comment\">--threshold=N] The minimum length of the callstack for groups to</span>\n consider <span class=\"hljs-keyword\">for</span> similarity analysis.\n [<span class=\"hljs-comment\">--intersect=N] The minimum number of common symbols between</span>\n two groups.\n [<span class=\"hljs-comment\">--distance=N] The maximum acceptable edit distance between</span>\n two groups.\n [<span class=\"hljs-comment\">--fingerprint=N] A fingerprint to compute similarity to.</span></pre><h3>invite</h3>\n<p>Invite new users into your system. Requires you to have logged in.</p>\n<pre>Usage: morgue invite &lt;create | list | resend&gt;\n create &lt;username&gt; &lt;email&gt;\n -<span class=\"ruby\">-role=&lt;<span class=\"hljs-string\">&quot;guest&quot;</span> <span class=\"hljs-params\">| &quot;member&quot; |</span> <span class=\"hljs-string\">&quot;admin&quot;</span>&gt;\n</span> -<span class=\"ruby\">-metadata=&lt;metadata&gt;\n</span> -<span class=\"ruby\">-tenant=&lt;tenant name&gt;\n</span> -<span class=\"ruby\">-method=&lt;<span class=\"hljs-string\">&quot;password&quot;</span> <span class=\"hljs-params\">| &quot;saml&quot; |</span> <span class=\"hljs-string\">&quot;pam&quot;</span>&gt;\n</span> delete &lt;token&gt;\n resend &lt;token&gt;</pre><h4>Examples</h4>\n<p>1.0 Invite a User</p>\n<p>Below, we invite a new user into the tenant currently logged into (or\nthe first tenant, if multiple exist). The default settings for the user\nare to use password authentication and have a <code>member</code> role.</p>\n<pre>$ morgue invite <span class=\"hljs-keyword\">create</span> &lt;username&gt; &lt;<span class=\"hljs-keyword\">user</span> <span class=\"hljs-built_in\">e</span>-mail&gt;</pre><pre>$ morgue invite sbahra user@backtrace.<span class=\"hljs-built_in\">io</span>\nInvitation successfully created <span class=\"hljs-keyword\">for</span> user@backtrace.<span class=\"hljs-built_in\">io</span>\nSending e-mail...done</pre><p>1.1 Invite a User as an Administrator</p>\n<pre>$ morgue invite <span class=\"hljs-keyword\">create</span> <span class=\"hljs-keyword\">user</span> <span class=\"hljs-keyword\">user</span>@gmail.com --<span class=\"hljs-keyword\">role</span>=admin\nInvitation successfully created <span class=\"hljs-keyword\">for</span> <span class=\"hljs-keyword\">user</span>@backtrace.io\nSending <span class=\"hljs-built_in\">e</span>-mail...done</pre><p>1.2 Invite a User into a Particular Tenant</p>\n<pre>$ morgue invite <span class=\"hljs-keyword\">create</span> <span class=\"hljs-keyword\">user</span> <span class=\"hljs-keyword\">user</span>@gmail.com --tenant=mystudio\nInvitation successfully created <span class=\"hljs-keyword\">for</span> <span class=\"hljs-keyword\">user</span>@backtrace.io\nSending <span class=\"hljs-built_in\">e</span>-mail...done</pre><p>2.0 List Pending Invitation</p>\n<p>This will list invitations that have yet to be accepted or\nactivated.</p>\n<pre>$ morgue invite <span class=\"hljs-type\">list</span>\nTenant Username Method Role Email Token\n <span class=\"hljs-number\">1</span> ashley2 password admin ashley2@backtrace.io f892200fa564...\n <span class=\"hljs-number\">1</span> jack1 password member jack@backtrace.io <span class=\"hljs-number\">39</span>c1b80a7e00...\n <span class=\"hljs-number\">1</span> jack2 password member jack+<span class=\"hljs-number\">2</span>@backtrace.io c399bdf23873...\n <span class=\"hljs-number\">1</span> jack17131 password member ja