sidekiq-undertaker 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-build.yml +30 -2
- data/.rubocop.yml +4 -0
- data/.rubocop_codeclimate.yml +9 -0
- data/CHANGELOG.md +11 -0
- data/README.md +2 -1
- data/lib/sidekiq/undertaker/dead_job.rb +10 -2
- data/lib/sidekiq/undertaker/job_distributor.rb +4 -0
- data/lib/sidekiq/undertaker/job_filter.rb +7 -2
- data/lib/sidekiq/undertaker/version.rb +1 -1
- data/lib/sidekiq/undertaker/web_extension/api_helpers.rb +42 -21
- data/lib/sidekiq/undertaker/web_extension.rb +11 -9
- data/sidekiq-undertaker.gemspec +4 -5
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +3 -3
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +24 -24
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +24 -24
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +231 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +231 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +8 -7
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +284 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1310 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +6 -5
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +54 -53
- data/spec/sidekiq/undertaker/dead_jobs_spec.rb +7 -4
- data/spec/sidekiq/undertaker/job_distributor_spec.rb +38 -16
- data/spec/sidekiq/undertaker/job_filter_spec.rb +26 -9
- data/spec/sidekiq/undertaker/web_extension_spec.rb +60 -17
- data/spec/spec_helper.rb +4 -0
- data/web/views/filter.erb +1 -1
- data/web/views/filter_job_class.erb +8 -8
- data/web/views/filter_job_class_error_class.erb +36 -0
- data/web/views/morgue.erb +4 -3
- metadata +21 -29
- data/.travis.yml +0 -51
| @@ -160,6 +160,7 @@ | |
| 160 160 | 
             
                  <b>2</b> dead jobs
         | 
| 161 161 | 
             
                   of <b>HardWorker</b> class
         | 
| 162 162 | 
             
                   with <b>RuntimeError</b> exception
         | 
| 163 | 
            +
                  
         | 
| 163 164 | 
             
                   in <b>1_hour</b> bucket
         | 
| 164 165 | 
             
                </h3>
         | 
| 165 166 | 
             
              </div>
         | 
| @@ -207,7 +208,7 @@ | |
| 207 208 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 208 209 | 
             
                        </td>
         | 
| 209 210 | 
             
                        <td>
         | 
| 210 | 
            -
                          <div>RuntimeError:  | 
| 211 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 211 212 | 
             
                        </td>
         | 
| 212 213 | 
             
                      </tr>
         | 
| 213 214 |  | 
| @@ -228,7 +229,7 @@ | |
| 228 229 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 229 230 | 
             
                        </td>
         | 
| 230 231 | 
             
                        <td>
         | 
| 231 | 
            -
                          <div>RuntimeError:  | 
| 232 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 232 233 | 
             
                        </td>
         | 
| 233 234 | 
             
                      </tr>
         | 
| 234 235 |  | 
| @@ -238,17 +239,17 @@ | |
| 238 239 | 
             
                  <input class="btn btn-danger btn-xs pull-left" type="submit" name="delete" value="Bury" />
         | 
| 239 240 | 
             
                </form>
         | 
| 240 241 |  | 
| 241 | 
            -
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/1_hour/delete" method="post">
         | 
| 242 | 
            +
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/YWxs/1_hour/delete" method="post">
         | 
| 242 243 | 
             
                  <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
         | 
| 243 244 | 
             
                  <input class="btn btn-danger btn-xs pull-right" type="submit" name="delete" value="Bury All" data-confirm="Are you sure?" />
         | 
| 244 245 | 
             
                </form>
         | 
| 245 246 |  | 
| 246 | 
            -
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/1_hour/export" method="post">
         | 
| 247 | 
            +
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/YWxs/1_hour/export" method="post">
         | 
| 247 248 | 
             
                  <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
         | 
| 248 249 | 
             
                  <input class="btn btn-secondary btn-xs pull-right" type="submit" name="export" value="Export All" />
         | 
| 249 250 | 
             
                </form>
         | 
| 250 251 |  | 
| 251 | 
            -
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/1_hour/retry" method="post">
         | 
| 252 | 
            +
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/YWxs/1_hour/retry" method="post">
         | 
| 252 253 | 
             
                  <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
         | 
| 253 254 | 
             
                  <input class="btn btn-danger btn-xs pull-right" type="submit" name="retry" value="Revive All" data-confirm="Are you sure?" />
         | 
| 254 255 | 
             
                </form>
         | 
| @@ -160,6 +160,7 @@ | |
| 160 160 | 
             
                  <b>52</b> dead jobs
         | 
| 161 161 | 
             
                   of <b>HardWorker</b> class
         | 
| 162 162 | 
             
                   with <b>RuntimeError</b> exception
         | 
| 163 | 
            +
                  
         | 
| 163 164 | 
             
                   in <b>1_hour</b> bucket
         | 
| 164 165 | 
             
                </h3>
         | 
| 165 166 | 
             
              </div>
         | 
| @@ -225,7 +226,7 @@ | |
| 225 226 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 226 227 | 
             
                        </td>
         | 
| 227 228 | 
             
                        <td>
         | 
| 228 | 
            -
                          <div>RuntimeError:  | 
| 229 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 229 230 | 
             
                        </td>
         | 
| 230 231 | 
             
                      </tr>
         | 
| 231 232 |  | 
| @@ -246,7 +247,7 @@ | |
| 246 247 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 247 248 | 
             
                        </td>
         | 
| 248 249 | 
             
                        <td>
         | 
| 249 | 
            -
                          <div>RuntimeError:  | 
| 250 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 250 251 | 
             
                        </td>
         | 
| 251 252 | 
             
                      </tr>
         | 
| 252 253 |  | 
| @@ -267,7 +268,7 @@ | |
| 267 268 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 268 269 | 
             
                        </td>
         | 
| 269 270 | 
             
                        <td>
         | 
| 270 | 
            -
                          <div>RuntimeError:  | 
| 271 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 271 272 | 
             
                        </td>
         | 
| 272 273 | 
             
                      </tr>
         | 
| 273 274 |  | 
| @@ -288,7 +289,7 @@ | |
| 288 289 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 289 290 | 
             
                        </td>
         | 
| 290 291 | 
             
                        <td>
         | 
| 291 | 
            -
                          <div>RuntimeError:  | 
| 292 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 292 293 | 
             
                        </td>
         | 
| 293 294 | 
             
                      </tr>
         | 
| 294 295 |  | 
| @@ -309,7 +310,7 @@ | |
| 309 310 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 310 311 | 
             
                        </td>
         | 
| 311 312 | 
             
                        <td>
         | 
| 312 | 
            -
                          <div>RuntimeError:  | 
| 313 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 313 314 | 
             
                        </td>
         | 
| 314 315 | 
             
                      </tr>
         | 
| 315 316 |  | 
| @@ -330,7 +331,7 @@ | |
| 330 331 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 331 332 | 
             
                        </td>
         | 
| 332 333 | 
             
                        <td>
         | 
| 333 | 
            -
                          <div>RuntimeError:  | 
| 334 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 334 335 | 
             
                        </td>
         | 
| 335 336 | 
             
                      </tr>
         | 
| 336 337 |  | 
| @@ -351,7 +352,7 @@ | |
| 351 352 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 352 353 | 
             
                        </td>
         | 
| 353 354 | 
             
                        <td>
         | 
| 354 | 
            -
                          <div>RuntimeError:  | 
| 355 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 355 356 | 
             
                        </td>
         | 
| 356 357 | 
             
                      </tr>
         | 
| 357 358 |  | 
| @@ -372,7 +373,7 @@ | |
| 372 373 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 373 374 | 
             
                        </td>
         | 
| 374 375 | 
             
                        <td>
         | 
| 375 | 
            -
                          <div>RuntimeError:  | 
| 376 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 376 377 | 
             
                        </td>
         | 
| 377 378 | 
             
                      </tr>
         | 
| 378 379 |  | 
| @@ -393,7 +394,7 @@ | |
| 393 394 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 394 395 | 
             
                        </td>
         | 
| 395 396 | 
             
                        <td>
         | 
| 396 | 
            -
                          <div>RuntimeError:  | 
| 397 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 397 398 | 
             
                        </td>
         | 
| 398 399 | 
             
                      </tr>
         | 
| 399 400 |  | 
| @@ -414,7 +415,7 @@ | |
| 414 415 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 415 416 | 
             
                        </td>
         | 
| 416 417 | 
             
                        <td>
         | 
| 417 | 
            -
                          <div>RuntimeError:  | 
| 418 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 418 419 | 
             
                        </td>
         | 
| 419 420 | 
             
                      </tr>
         | 
| 420 421 |  | 
| @@ -435,7 +436,7 @@ | |
| 435 436 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 436 437 | 
             
                        </td>
         | 
| 437 438 | 
             
                        <td>
         | 
| 438 | 
            -
                          <div>RuntimeError:  | 
| 439 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 439 440 | 
             
                        </td>
         | 
| 440 441 | 
             
                      </tr>
         | 
| 441 442 |  | 
| @@ -456,7 +457,7 @@ | |
| 456 457 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 457 458 | 
             
                        </td>
         | 
| 458 459 | 
             
                        <td>
         | 
| 459 | 
            -
                          <div>RuntimeError:  | 
| 460 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 460 461 | 
             
                        </td>
         | 
| 461 462 | 
             
                      </tr>
         | 
| 462 463 |  | 
| @@ -477,7 +478,7 @@ | |
| 477 478 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 478 479 | 
             
                        </td>
         | 
| 479 480 | 
             
                        <td>
         | 
| 480 | 
            -
                          <div>RuntimeError:  | 
| 481 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 481 482 | 
             
                        </td>
         | 
| 482 483 | 
             
                      </tr>
         | 
| 483 484 |  | 
| @@ -498,7 +499,7 @@ | |
| 498 499 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 499 500 | 
             
                        </td>
         | 
| 500 501 | 
             
                        <td>
         | 
| 501 | 
            -
                          <div>RuntimeError:  | 
| 502 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 502 503 | 
             
                        </td>
         | 
| 503 504 | 
             
                      </tr>
         | 
| 504 505 |  | 
| @@ -519,7 +520,7 @@ | |
| 519 520 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 520 521 | 
             
                        </td>
         | 
| 521 522 | 
             
                        <td>
         | 
| 522 | 
            -
                          <div>RuntimeError:  | 
| 523 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 523 524 | 
             
                        </td>
         | 
| 524 525 | 
             
                      </tr>
         | 
| 525 526 |  | 
| @@ -540,7 +541,7 @@ | |
| 540 541 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 541 542 | 
             
                        </td>
         | 
| 542 543 | 
             
                        <td>
         | 
| 543 | 
            -
                          <div>RuntimeError:  | 
| 544 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 544 545 | 
             
                        </td>
         | 
| 545 546 | 
             
                      </tr>
         | 
| 546 547 |  | 
| @@ -561,7 +562,7 @@ | |
| 561 562 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 562 563 | 
             
                        </td>
         | 
| 563 564 | 
             
                        <td>
         | 
| 564 | 
            -
                          <div>RuntimeError:  | 
| 565 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 565 566 | 
             
                        </td>
         | 
| 566 567 | 
             
                      </tr>
         | 
| 567 568 |  | 
| @@ -582,7 +583,7 @@ | |
| 582 583 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 583 584 | 
             
                        </td>
         | 
| 584 585 | 
             
                        <td>
         | 
| 585 | 
            -
                          <div>RuntimeError:  | 
| 586 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 586 587 | 
             
                        </td>
         | 
| 587 588 | 
             
                      </tr>
         | 
| 588 589 |  | 
| @@ -603,7 +604,7 @@ | |
| 603 604 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 604 605 | 
             
                        </td>
         | 
| 605 606 | 
             
                        <td>
         | 
| 606 | 
            -
                          <div>RuntimeError:  | 
| 607 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 607 608 | 
             
                        </td>
         | 
| 608 609 | 
             
                      </tr>
         | 
| 609 610 |  | 
| @@ -624,7 +625,7 @@ | |
| 624 625 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 625 626 | 
             
                        </td>
         | 
| 626 627 | 
             
                        <td>
         | 
| 627 | 
            -
                          <div>RuntimeError:  | 
| 628 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 628 629 | 
             
                        </td>
         | 
| 629 630 | 
             
                      </tr>
         | 
| 630 631 |  | 
| @@ -645,7 +646,7 @@ | |
| 645 646 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 646 647 | 
             
                        </td>
         | 
| 647 648 | 
             
                        <td>
         | 
| 648 | 
            -
                          <div>RuntimeError:  | 
| 649 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 649 650 | 
             
                        </td>
         | 
| 650 651 | 
             
                      </tr>
         | 
| 651 652 |  | 
| @@ -666,7 +667,7 @@ | |
| 666 667 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 667 668 | 
             
                        </td>
         | 
| 668 669 | 
             
                        <td>
         | 
| 669 | 
            -
                          <div>RuntimeError:  | 
| 670 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 670 671 | 
             
                        </td>
         | 
| 671 672 | 
             
                      </tr>
         | 
| 672 673 |  | 
| @@ -687,7 +688,7 @@ | |
| 687 688 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 688 689 | 
             
                        </td>
         | 
| 689 690 | 
             
                        <td>
         | 
| 690 | 
            -
                          <div>RuntimeError:  | 
| 691 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 691 692 | 
             
                        </td>
         | 
| 692 693 | 
             
                      </tr>
         | 
| 693 694 |  | 
| @@ -708,7 +709,7 @@ | |
| 708 709 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 709 710 | 
             
                        </td>
         | 
| 710 711 | 
             
                        <td>
         | 
| 711 | 
            -
                          <div>RuntimeError:  | 
| 712 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 712 713 | 
             
                        </td>
         | 
| 713 714 | 
             
                      </tr>
         | 
| 714 715 |  | 
| @@ -729,7 +730,7 @@ | |
| 729 730 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 730 731 | 
             
                        </td>
         | 
| 731 732 | 
             
                        <td>
         | 
| 732 | 
            -
                          <div>RuntimeError:  | 
| 733 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 733 734 | 
             
                        </td>
         | 
| 734 735 | 
             
                      </tr>
         | 
| 735 736 |  | 
| @@ -750,7 +751,7 @@ | |
| 750 751 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 751 752 | 
             
                        </td>
         | 
| 752 753 | 
             
                        <td>
         | 
| 753 | 
            -
                          <div>RuntimeError:  | 
| 754 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 754 755 | 
             
                        </td>
         | 
| 755 756 | 
             
                      </tr>
         | 
| 756 757 |  | 
| @@ -771,7 +772,7 @@ | |
| 771 772 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 772 773 | 
             
                        </td>
         | 
| 773 774 | 
             
                        <td>
         | 
| 774 | 
            -
                          <div>RuntimeError:  | 
| 775 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 775 776 | 
             
                        </td>
         | 
| 776 777 | 
             
                      </tr>
         | 
| 777 778 |  | 
| @@ -792,7 +793,7 @@ | |
| 792 793 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 793 794 | 
             
                        </td>
         | 
| 794 795 | 
             
                        <td>
         | 
| 795 | 
            -
                          <div>RuntimeError:  | 
| 796 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 796 797 | 
             
                        </td>
         | 
| 797 798 | 
             
                      </tr>
         | 
| 798 799 |  | 
| @@ -813,7 +814,7 @@ | |
| 813 814 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 814 815 | 
             
                        </td>
         | 
| 815 816 | 
             
                        <td>
         | 
| 816 | 
            -
                          <div>RuntimeError:  | 
| 817 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 817 818 | 
             
                        </td>
         | 
| 818 819 | 
             
                      </tr>
         | 
| 819 820 |  | 
| @@ -834,7 +835,7 @@ | |
| 834 835 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 835 836 | 
             
                        </td>
         | 
| 836 837 | 
             
                        <td>
         | 
| 837 | 
            -
                          <div>RuntimeError:  | 
| 838 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 838 839 | 
             
                        </td>
         | 
| 839 840 | 
             
                      </tr>
         | 
| 840 841 |  | 
| @@ -855,7 +856,7 @@ | |
| 855 856 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 856 857 | 
             
                        </td>
         | 
| 857 858 | 
             
                        <td>
         | 
| 858 | 
            -
                          <div>RuntimeError:  | 
| 859 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 859 860 | 
             
                        </td>
         | 
| 860 861 | 
             
                      </tr>
         | 
| 861 862 |  | 
| @@ -876,7 +877,7 @@ | |
| 876 877 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 877 878 | 
             
                        </td>
         | 
| 878 879 | 
             
                        <td>
         | 
| 879 | 
            -
                          <div>RuntimeError:  | 
| 880 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 880 881 | 
             
                        </td>
         | 
| 881 882 | 
             
                      </tr>
         | 
| 882 883 |  | 
| @@ -897,7 +898,7 @@ | |
| 897 898 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 898 899 | 
             
                        </td>
         | 
| 899 900 | 
             
                        <td>
         | 
| 900 | 
            -
                          <div>RuntimeError:  | 
| 901 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 901 902 | 
             
                        </td>
         | 
| 902 903 | 
             
                      </tr>
         | 
| 903 904 |  | 
| @@ -918,7 +919,7 @@ | |
| 918 919 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 919 920 | 
             
                        </td>
         | 
| 920 921 | 
             
                        <td>
         | 
| 921 | 
            -
                          <div>RuntimeError:  | 
| 922 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 922 923 | 
             
                        </td>
         | 
| 923 924 | 
             
                      </tr>
         | 
| 924 925 |  | 
| @@ -939,7 +940,7 @@ | |
| 939 940 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 940 941 | 
             
                        </td>
         | 
| 941 942 | 
             
                        <td>
         | 
| 942 | 
            -
                          <div>RuntimeError:  | 
| 943 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 943 944 | 
             
                        </td>
         | 
| 944 945 | 
             
                      </tr>
         | 
| 945 946 |  | 
| @@ -960,7 +961,7 @@ | |
| 960 961 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 961 962 | 
             
                        </td>
         | 
| 962 963 | 
             
                        <td>
         | 
| 963 | 
            -
                          <div>RuntimeError:  | 
| 964 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 964 965 | 
             
                        </td>
         | 
| 965 966 | 
             
                      </tr>
         | 
| 966 967 |  | 
| @@ -981,7 +982,7 @@ | |
| 981 982 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 982 983 | 
             
                        </td>
         | 
| 983 984 | 
             
                        <td>
         | 
| 984 | 
            -
                          <div>RuntimeError:  | 
| 985 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 985 986 | 
             
                        </td>
         | 
| 986 987 | 
             
                      </tr>
         | 
| 987 988 |  | 
| @@ -1002,7 +1003,7 @@ | |
| 1002 1003 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1003 1004 | 
             
                        </td>
         | 
| 1004 1005 | 
             
                        <td>
         | 
| 1005 | 
            -
                          <div>RuntimeError:  | 
| 1006 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1006 1007 | 
             
                        </td>
         | 
| 1007 1008 | 
             
                      </tr>
         | 
| 1008 1009 |  | 
| @@ -1023,7 +1024,7 @@ | |
| 1023 1024 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1024 1025 | 
             
                        </td>
         | 
| 1025 1026 | 
             
                        <td>
         | 
| 1026 | 
            -
                          <div>RuntimeError:  | 
| 1027 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1027 1028 | 
             
                        </td>
         | 
| 1028 1029 | 
             
                      </tr>
         | 
| 1029 1030 |  | 
| @@ -1044,7 +1045,7 @@ | |
| 1044 1045 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1045 1046 | 
             
                        </td>
         | 
| 1046 1047 | 
             
                        <td>
         | 
| 1047 | 
            -
                          <div>RuntimeError:  | 
| 1048 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1048 1049 | 
             
                        </td>
         | 
| 1049 1050 | 
             
                      </tr>
         | 
| 1050 1051 |  | 
| @@ -1065,7 +1066,7 @@ | |
| 1065 1066 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1066 1067 | 
             
                        </td>
         | 
| 1067 1068 | 
             
                        <td>
         | 
| 1068 | 
            -
                          <div>RuntimeError:  | 
| 1069 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1069 1070 | 
             
                        </td>
         | 
| 1070 1071 | 
             
                      </tr>
         | 
| 1071 1072 |  | 
| @@ -1086,7 +1087,7 @@ | |
| 1086 1087 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1087 1088 | 
             
                        </td>
         | 
| 1088 1089 | 
             
                        <td>
         | 
| 1089 | 
            -
                          <div>RuntimeError:  | 
| 1090 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1090 1091 | 
             
                        </td>
         | 
| 1091 1092 | 
             
                      </tr>
         | 
| 1092 1093 |  | 
| @@ -1107,7 +1108,7 @@ | |
| 1107 1108 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1108 1109 | 
             
                        </td>
         | 
| 1109 1110 | 
             
                        <td>
         | 
| 1110 | 
            -
                          <div>RuntimeError:  | 
| 1111 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1111 1112 | 
             
                        </td>
         | 
| 1112 1113 | 
             
                      </tr>
         | 
| 1113 1114 |  | 
| @@ -1128,7 +1129,7 @@ | |
| 1128 1129 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1129 1130 | 
             
                        </td>
         | 
| 1130 1131 | 
             
                        <td>
         | 
| 1131 | 
            -
                          <div>RuntimeError:  | 
| 1132 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1132 1133 | 
             
                        </td>
         | 
| 1133 1134 | 
             
                      </tr>
         | 
| 1134 1135 |  | 
| @@ -1149,7 +1150,7 @@ | |
| 1149 1150 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1150 1151 | 
             
                        </td>
         | 
| 1151 1152 | 
             
                        <td>
         | 
| 1152 | 
            -
                          <div>RuntimeError:  | 
| 1153 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1153 1154 | 
             
                        </td>
         | 
| 1154 1155 | 
             
                      </tr>
         | 
| 1155 1156 |  | 
| @@ -1170,7 +1171,7 @@ | |
| 1170 1171 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1171 1172 | 
             
                        </td>
         | 
| 1172 1173 | 
             
                        <td>
         | 
| 1173 | 
            -
                          <div>RuntimeError:  | 
| 1174 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1174 1175 | 
             
                        </td>
         | 
| 1175 1176 | 
             
                      </tr>
         | 
| 1176 1177 |  | 
| @@ -1191,7 +1192,7 @@ | |
| 1191 1192 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1192 1193 | 
             
                        </td>
         | 
| 1193 1194 | 
             
                        <td>
         | 
| 1194 | 
            -
                          <div>RuntimeError:  | 
| 1195 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1195 1196 | 
             
                        </td>
         | 
| 1196 1197 | 
             
                      </tr>
         | 
| 1197 1198 |  | 
| @@ -1212,7 +1213,7 @@ | |
| 1212 1213 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1213 1214 | 
             
                        </td>
         | 
| 1214 1215 | 
             
                        <td>
         | 
| 1215 | 
            -
                          <div>RuntimeError:  | 
| 1216 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1216 1217 | 
             
                        </td>
         | 
| 1217 1218 | 
             
                      </tr>
         | 
| 1218 1219 |  | 
| @@ -1233,7 +1234,7 @@ | |
| 1233 1234 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1234 1235 | 
             
                        </td>
         | 
| 1235 1236 | 
             
                        <td>
         | 
| 1236 | 
            -
                          <div>RuntimeError:  | 
| 1237 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1237 1238 | 
             
                        </td>
         | 
| 1238 1239 | 
             
                      </tr>
         | 
| 1239 1240 |  | 
| @@ -1254,7 +1255,7 @@ | |
| 1254 1255 | 
             
                          <div class="args">"asdf", 1234</div>
         | 
| 1255 1256 | 
             
                        </td>
         | 
| 1256 1257 | 
             
                        <td>
         | 
| 1257 | 
            -
                          <div>RuntimeError:  | 
| 1258 | 
            +
                          <div>RuntimeError: Option 'data/file_name' is required! This is an extra long error message.</div>
         | 
| 1258 1259 | 
             
                        </td>
         | 
| 1259 1260 | 
             
                      </tr>
         | 
| 1260 1261 |  | 
| @@ -1264,17 +1265,17 @@ | |
| 1264 1265 | 
             
                  <input class="btn btn-danger btn-xs pull-left" type="submit" name="delete" value="Bury" />
         | 
| 1265 1266 | 
             
                </form>
         | 
| 1266 1267 |  | 
| 1267 | 
            -
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/1_hour/delete" method="post">
         | 
| 1268 | 
            +
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/YWxs/1_hour/delete" method="post">
         | 
| 1268 1269 | 
             
                  <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
         | 
| 1269 1270 | 
             
                  <input class="btn btn-danger btn-xs pull-right" type="submit" name="delete" value="Bury All" data-confirm="Are you sure?" />
         | 
| 1270 1271 | 
             
                </form>
         | 
| 1271 1272 |  | 
| 1272 | 
            -
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/1_hour/export" method="post">
         | 
| 1273 | 
            +
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/YWxs/1_hour/export" method="post">
         | 
| 1273 1274 | 
             
                  <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
         | 
| 1274 1275 | 
             
                  <input class="btn btn-secondary btn-xs pull-right" type="submit" name="export" value="Export All" />
         | 
| 1275 1276 | 
             
                </form>
         | 
| 1276 1277 |  | 
| 1277 | 
            -
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/1_hour/retry" method="post">
         | 
| 1278 | 
            +
                <form action="/sidekiq/undertaker/morgue/HardWorker/RuntimeError/YWxs/1_hour/retry" method="post">
         | 
| 1278 1279 | 
             
                  <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
         | 
| 1279 1280 | 
             
                  <input class="btn btn-danger btn-xs pull-right" type="submit" name="retry" value="Revive All" data-confirm="Are you sure?" />
         | 
| 1280 1281 | 
             
                </form>
         | 
| @@ -7,10 +7,11 @@ module Sidekiq | |
| 7 7 | 
             
                describe DeadJob do
         | 
| 8 8 | 
             
                  let(:job) do
         | 
| 9 9 | 
             
                    build_job(
         | 
| 10 | 
            -
                      "class" | 
| 11 | 
            -
                      "failed_at" | 
| 12 | 
            -
                      "error_class" | 
| 13 | 
            -
                      "queue" | 
| 10 | 
            +
                      "class"         => "HardWorkTask",
         | 
| 11 | 
            +
                      "failed_at"     => Time.now,
         | 
| 12 | 
            +
                      "error_class"   => "NoMethodError",
         | 
| 13 | 
            +
                      "queue"         => "SomeQueue",
         | 
| 14 | 
            +
                      "error_message" => "undefined method `pause` for HardWork:Class"
         | 
| 14 15 | 
             
                    )
         | 
| 15 16 | 
             
                  end
         | 
| 16 17 |  | 
| @@ -20,6 +21,7 @@ module Sidekiq | |
| 20 21 | 
             
                        job_class:                  "HardWorkTask",
         | 
| 21 22 | 
             
                        time_elapsed_since_failure: 9,
         | 
| 22 23 | 
             
                        error_class:                "NoMethodError",
         | 
| 24 | 
            +
                        error_msg:                  "undefined method `pause` for H...",
         | 
| 23 25 | 
             
                        bucket_name:                "1_hour",
         | 
| 24 26 | 
             
                        job:                        job
         | 
| 25 27 | 
             
                      }
         | 
| @@ -54,6 +56,7 @@ module Sidekiq | |
| 54 56 | 
             
                        job_class:                  "HardWorkTask",
         | 
| 55 57 | 
             
                        time_elapsed_since_failure: time_elapsed,
         | 
| 56 58 | 
             
                        error_class:                "NoMethodError",
         | 
| 59 | 
            +
                        error_msg:                  "undefined method `pause` for H...",
         | 
| 57 60 | 
             
                        bucket_name:                "1_hour",
         | 
| 58 61 | 
             
                        job:                        killed_job
         | 
| 59 62 | 
             
                      )
         | 
| @@ -3,40 +3,45 @@ | |
| 3 3 | 
             
            require "spec_helper"
         | 
| 4 4 |  | 
| 5 5 | 
             
            module Sidekiq
         | 
| 6 | 
            +
              # rubocop:disable Metrics/ModuleLength
         | 
| 6 7 | 
             
              module Undertaker
         | 
| 7 8 | 
             
                describe JobDistributor do
         | 
| 8 9 | 
             
                  let(:job1) do
         | 
| 9 10 | 
             
                    instance_double(Sidekiq::JobRecord, item: {
         | 
| 10 | 
            -
                                      "class" | 
| 11 | 
            -
                                      "failed_at" | 
| 12 | 
            -
                                      "error_class" | 
| 11 | 
            +
                                      "class"         => "A",
         | 
| 12 | 
            +
                                      "failed_at"     => 1,
         | 
| 13 | 
            +
                                      "error_class"   => "E1",
         | 
| 14 | 
            +
                                      "error_message" => "M1"
         | 
| 13 15 | 
             
                                    })
         | 
| 14 16 | 
             
                  end
         | 
| 15 17 | 
             
                  let(:job2) do
         | 
| 16 18 | 
             
                    instance_double(Sidekiq::JobRecord, item: {
         | 
| 17 | 
            -
                                      "class" | 
| 18 | 
            -
                                      "failed_at" | 
| 19 | 
            -
                                      "error_class" | 
| 19 | 
            +
                                      "class"         => "A",
         | 
| 20 | 
            +
                                      "failed_at"     => 1,
         | 
| 21 | 
            +
                                      "error_class"   => "E1",
         | 
| 22 | 
            +
                                      "error_message" => "M1"
         | 
| 20 23 | 
             
                                    })
         | 
| 21 24 | 
             
                  end
         | 
| 22 25 | 
             
                  let(:job3) do
         | 
| 23 26 | 
             
                    instance_double(Sidekiq::JobRecord, item: {
         | 
| 24 | 
            -
                                      "class" | 
| 25 | 
            -
                                      "failed_at" | 
| 26 | 
            -
                                      "error_class" | 
| 27 | 
            +
                                      "class"         => "B",
         | 
| 28 | 
            +
                                      "failed_at"     => 1,
         | 
| 29 | 
            +
                                      "error_class"   => "E1",
         | 
| 30 | 
            +
                                      "error_message" => "M2"
         | 
| 27 31 | 
             
                                    })
         | 
| 28 32 | 
             
                  end
         | 
| 29 33 | 
             
                  let(:job4) do
         | 
| 30 34 | 
             
                    instance_double(Sidekiq::JobRecord, item: {
         | 
| 31 | 
            -
                                      "class" | 
| 32 | 
            -
                                      "failed_at" | 
| 33 | 
            -
                                      "error_class" | 
| 35 | 
            +
                                      "class"         => "B",
         | 
| 36 | 
            +
                                      "failed_at"     => 1,
         | 
| 37 | 
            +
                                      "error_class"   => "E2",
         | 
| 38 | 
            +
                                      "error_message" => "M1"
         | 
| 34 39 | 
             
                                    })
         | 
| 35 40 | 
             
                  end
         | 
| 36 41 |  | 
| 37 42 | 
             
                  let(:dead_job1) do
         | 
| 38 43 | 
             
                    DeadJob.new(
         | 
| 39 | 
            -
                      job:                        job1, # 'A', 'E1'
         | 
| 44 | 
            +
                      job:                        job1, # 'A', 'E1', 'M1'
         | 
| 40 45 | 
             
                      time_elapsed_since_failure: 10,
         | 
| 41 46 | 
             
                      bucket_name:                "1_hour"
         | 
| 42 47 | 
             
                    )
         | 
| @@ -44,21 +49,21 @@ module Sidekiq | |
| 44 49 |  | 
| 45 50 | 
             
                  let(:dead_job2) do
         | 
| 46 51 | 
             
                    DeadJob.new(
         | 
| 47 | 
            -
                      job:                        job2, # 'A', 'E1'
         | 
| 52 | 
            +
                      job:                        job2, # 'A', 'E1', 'M1'
         | 
| 48 53 | 
             
                      time_elapsed_since_failure: 10 + (60 * 60),
         | 
| 49 54 | 
             
                      bucket_name:                "3_hours"
         | 
| 50 55 | 
             
                    )
         | 
| 51 56 | 
             
                  end
         | 
| 52 57 | 
             
                  let(:dead_job3) do
         | 
| 53 58 | 
             
                    DeadJob.new(
         | 
| 54 | 
            -
                      job:                        job3, # 'B', 'E1'
         | 
| 59 | 
            +
                      job:                        job3, # 'B', 'E1', 'M2'
         | 
| 55 60 | 
             
                      time_elapsed_since_failure: 10 + (60 * 60),
         | 
| 56 61 | 
             
                      bucket_name:                "3_hours"
         | 
| 57 62 | 
             
                    )
         | 
| 58 63 | 
             
                  end
         | 
| 59 64 | 
             
                  let(:dead_job4) do
         | 
| 60 65 | 
             
                    DeadJob.new(
         | 
| 61 | 
            -
                      job:                        job4, # 'B', 'E2'
         | 
| 66 | 
            +
                      job:                        job4, # 'B', 'E2', 'M1'
         | 
| 62 67 | 
             
                      time_elapsed_since_failure: 10 + (60 * 60 * 24),
         | 
| 63 68 | 
             
                      bucket_name:                "1_day"
         | 
| 64 69 | 
             
                    )
         | 
| @@ -98,7 +103,24 @@ module Sidekiq | |
| 98 103 | 
             
                      expect(distribution).to eq expected_distribution
         | 
| 99 104 | 
             
                    end
         | 
| 100 105 | 
             
                  end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  describe "#group_by_error_msg" do
         | 
| 108 | 
            +
                    subject(:distribution) { described_class.new(dead_jobs).group_by_error_msg }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    let(:expected_distribution) do
         | 
| 111 | 
            +
                      [
         | 
| 112 | 
            +
                        ["all", { "1_hour" => 1, "3_hours" => 2, "1_day" => 1,  "3_days" => 0, "1_week" => 0, "older" => 0, "total_dead" => 4 }],
         | 
| 113 | 
            +
                        ["M1",  { "1_hour" => 1, "3_hours" => 1, "1_day" => 1,  "3_days" => 0, "1_week" => 0, "older" => 0, "total_dead" => 3 }],
         | 
| 114 | 
            +
                        ["M2",  { "1_hour" => 0, "3_hours" => 1, "1_day" => 0,  "3_days" => 0, "1_week" => 0, "older" => 0, "total_dead" => 1 }]
         | 
| 115 | 
            +
                      ]
         | 
| 116 | 
            +
                    end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    it "distributes the dead jobs into buckets and groups them by error_msg" do
         | 
| 119 | 
            +
                      expect(distribution).to eq expected_distribution
         | 
| 120 | 
            +
                    end
         | 
| 121 | 
            +
                  end
         | 
| 101 122 | 
             
                  # rubocop:enable Layout/LineLength
         | 
| 102 123 | 
             
                end
         | 
| 103 124 | 
             
              end
         | 
| 125 | 
            +
              # rubocop:enable Metrics/ModuleLength
         | 
| 104 126 | 
             
            end
         |