sidekiq 6.2.2 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +279 -11
  3. data/LICENSE.txt +9 -0
  4. data/README.md +45 -32
  5. data/bin/sidekiq +4 -9
  6. data/bin/sidekiqload +207 -117
  7. data/bin/sidekiqmon +4 -1
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  11. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  12. data/lib/sidekiq/api.rb +331 -187
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +94 -81
  15. data/lib/sidekiq/client.rb +100 -96
  16. data/lib/sidekiq/{util.rb → component.rb} +14 -41
  17. data/lib/sidekiq/config.rb +274 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +26 -26
  21. data/lib/sidekiq/job.rb +371 -5
  22. data/lib/sidekiq/job_logger.rb +16 -28
  23. data/lib/sidekiq/job_retry.rb +85 -59
  24. data/lib/sidekiq/job_util.rb +105 -0
  25. data/lib/sidekiq/launcher.rb +106 -94
  26. data/lib/sidekiq/logger.rb +9 -44
  27. data/lib/sidekiq/manager.rb +40 -41
  28. data/lib/sidekiq/metrics/query.rb +153 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +96 -51
  32. data/lib/sidekiq/middleware/current_attributes.rb +56 -0
  33. data/lib/sidekiq/middleware/i18n.rb +6 -4
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +17 -4
  36. data/lib/sidekiq/paginator.rb +17 -9
  37. data/lib/sidekiq/processor.rb +60 -60
  38. data/lib/sidekiq/rails.rb +25 -6
  39. data/lib/sidekiq/redis_client_adapter.rb +96 -0
  40. data/lib/sidekiq/redis_connection.rb +17 -88
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +101 -44
  43. data/lib/sidekiq/testing/inline.rb +4 -4
  44. data/lib/sidekiq/testing.rb +41 -68
  45. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  46. data/lib/sidekiq/version.rb +2 -1
  47. data/lib/sidekiq/web/action.rb +3 -3
  48. data/lib/sidekiq/web/application.rb +47 -13
  49. data/lib/sidekiq/web/csrf_protection.rb +3 -3
  50. data/lib/sidekiq/web/helpers.rb +36 -33
  51. data/lib/sidekiq/web.rb +10 -17
  52. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  53. data/lib/sidekiq.rb +86 -201
  54. data/sidekiq.gemspec +12 -10
  55. data/web/assets/javascripts/application.js +131 -60
  56. data/web/assets/javascripts/base-charts.js +106 -0
  57. data/web/assets/javascripts/chart.min.js +13 -0
  58. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  59. data/web/assets/javascripts/dashboard-charts.js +166 -0
  60. data/web/assets/javascripts/dashboard.js +36 -273
  61. data/web/assets/javascripts/metrics.js +264 -0
  62. data/web/assets/stylesheets/application-dark.css +23 -23
  63. data/web/assets/stylesheets/application-rtl.css +2 -95
  64. data/web/assets/stylesheets/application.css +73 -402
  65. data/web/locales/ar.yml +70 -70
  66. data/web/locales/cs.yml +62 -62
  67. data/web/locales/da.yml +60 -53
  68. data/web/locales/de.yml +65 -65
  69. data/web/locales/el.yml +43 -24
  70. data/web/locales/en.yml +82 -69
  71. data/web/locales/es.yml +68 -68
  72. data/web/locales/fa.yml +65 -65
  73. data/web/locales/fr.yml +81 -67
  74. data/web/locales/gd.yml +99 -0
  75. data/web/locales/he.yml +65 -64
  76. data/web/locales/hi.yml +59 -59
  77. data/web/locales/it.yml +53 -53
  78. data/web/locales/ja.yml +73 -68
  79. data/web/locales/ko.yml +52 -52
  80. data/web/locales/lt.yml +66 -66
  81. data/web/locales/nb.yml +61 -61
  82. data/web/locales/nl.yml +52 -52
  83. data/web/locales/pl.yml +45 -45
  84. data/web/locales/pt-br.yml +63 -55
  85. data/web/locales/pt.yml +51 -51
  86. data/web/locales/ru.yml +67 -66
  87. data/web/locales/sv.yml +53 -53
  88. data/web/locales/ta.yml +60 -60
  89. data/web/locales/uk.yml +62 -61
  90. data/web/locales/ur.yml +64 -64
  91. data/web/locales/vi.yml +67 -67
  92. data/web/locales/zh-cn.yml +43 -16
  93. data/web/locales/zh-tw.yml +42 -8
  94. data/web/views/_footer.erb +6 -3
  95. data/web/views/_job_info.erb +18 -2
  96. data/web/views/_metrics_period_select.erb +12 -0
  97. data/web/views/_nav.erb +1 -1
  98. data/web/views/_paging.erb +2 -0
  99. data/web/views/_poll_link.erb +3 -6
  100. data/web/views/_summary.erb +7 -7
  101. data/web/views/busy.erb +44 -28
  102. data/web/views/dashboard.erb +44 -12
  103. data/web/views/layout.erb +1 -1
  104. data/web/views/metrics.erb +82 -0
  105. data/web/views/metrics_for_job.erb +68 -0
  106. data/web/views/morgue.erb +5 -9
  107. data/web/views/queue.erb +24 -24
  108. data/web/views/queues.erb +4 -2
  109. data/web/views/retries.erb +5 -9
  110. data/web/views/scheduled.erb +12 -13
  111. metadata +62 -31
  112. data/LICENSE +0 -9
  113. data/lib/generators/sidekiq/worker_generator.rb +0 -57
  114. data/lib/sidekiq/delay.rb +0 -41
  115. data/lib/sidekiq/exception_handler.rb +0 -27
  116. data/lib/sidekiq/extensions/action_mailer.rb +0 -48
  117. data/lib/sidekiq/extensions/active_record.rb +0 -43
  118. data/lib/sidekiq/extensions/class_methods.rb +0 -43
  119. data/lib/sidekiq/extensions/generic_proxy.rb +0 -33
  120. data/lib/sidekiq/worker.rb +0 -244
@@ -21,7 +21,7 @@ body {
21
21
  a {
22
22
  color: #b1003e;
23
23
  }
24
- a:active, a:hover {
24
+ a:active, a:hover, a:focus {
25
25
  color: #4b001a;
26
26
  }
27
27
 
@@ -67,10 +67,17 @@ body {
67
67
  padding: 0 20px;
68
68
  }
69
69
 
70
- h3 {
70
+ h1, h2, h3 {
71
+ font-size: 24px;
71
72
  line-height: 45px;
72
73
  }
73
74
 
75
+ .header-container, .header-container .page-title-container {
76
+ display: flex;
77
+ justify-content: space-between;
78
+ align-items: center;
79
+ }
80
+
74
81
  .centered {
75
82
  text-align: center;
76
83
  }
@@ -89,19 +96,18 @@ header.row .pagination {
89
96
  .summary_bar .summary {
90
97
  margin-top: 12px;
91
98
  background-color: #fff;
92
- box-shadow: 0 0 5px rgba(50, 50, 50, 0.25);
93
99
  border-radius: 4px;
100
+ border: 1px solid rgba(0, 0, 0, 0.1);
94
101
  padding: 8px;
95
102
  margin-bottom: 10px;
96
- border-width: 0;
97
103
  }
98
104
  .poll-wrapper {
99
105
  margin: 9px;
100
106
  }
101
- #live-poll.active {
107
+ .live-poll.active {
102
108
  background-color: #009300;
103
109
  }
104
- #live-poll.active:hover {
110
+ .live-poll.active:hover {
105
111
  background-color: #777;
106
112
  }
107
113
  .summary_bar ul {
@@ -203,6 +209,7 @@ table .table-checkbox label {
203
209
 
204
210
  .navbar .navbar-brand .status {
205
211
  color: #585454;
212
+ display: inline;
206
213
  }
207
214
 
208
215
 
@@ -266,18 +273,6 @@ table .table-checkbox label {
266
273
  .navbar .poll-wrapper {
267
274
  margin: 4px 4px 0 0;
268
275
  }
269
-
270
- .navbar .dropdown-menu {
271
- min-width: 120px;
272
- }
273
-
274
- .navbar .dropdown-menu a {
275
- text-align: left;
276
- }
277
- }
278
-
279
- .nav .dropdown {
280
- display: none;
281
276
  }
282
277
 
283
278
  .navbar-footer .navbar ul.nav {
@@ -362,6 +357,7 @@ img.smallogo {
362
357
  text-align: center;
363
358
  margin-right: 20px;
364
359
  border: 1px solid rgba(0, 0, 0, 0.1);
360
+ border-radius: 4px;
365
361
  padding: 5px;
366
362
  width: 150px;
367
363
  margin-bottom: 20px;
@@ -417,57 +413,31 @@ span.current-interval {
417
413
 
418
414
  div.interval-slider input {
419
415
  width: 160px;
420
- height: 3px;
421
- margin-top: 5px;
422
416
  border-radius: 2px;
423
417
  background: currentcolor;
424
418
  }
425
419
 
426
- #realtime-legend,
427
- #history-legend {
428
- width: 580px;
429
- text-align: left;
430
- margin-top: 5px;
431
- float: right;
432
- }
433
- #realtime-legend .timestamp,
434
- #history-legend .timestamp {
435
- display: inline-block;
436
- width: 220px;
437
- text-align: right;
420
+ #realtime-legend {
421
+ margin-top: -20px;
422
+ padding-left: 30px;
423
+ display: flex;
424
+ justify-content: end;
425
+ align-items: center;
438
426
  }
439
- #realtime-legend .line,
440
- #history-legend .line {
441
- display: inline-block;
442
- margin: 0 0 0 20px;
427
+ #realtime-legend > * {
428
+ min-width: 14rem;
443
429
  }
444
- #realtime-legend .swatch,
445
- #history-legend .swatch {
430
+ #realtime-legend .swatch {
446
431
  display: inline-block;
447
432
  width: 10px;
448
433
  height: 10px;
449
- margin: 0 8px 0 0;
450
- }
451
- #realtime-legend .tag,
452
- #history-legend .tag {
453
- display: inline-block;
434
+ margin: 0 5px;
454
435
  }
455
-
456
- @media (max-width: 790px) {
457
- #realtime-legend,
458
- #history-legend {
459
- float: none;
460
- width: 100%;
461
- margin-bottom: 20px;
462
- }
436
+ #realtime-legend .time {
437
+ min-width: auto;
438
+ text-align: right;
463
439
  }
464
440
 
465
- @media (max-width: 500px) {
466
- #realtime-legend,
467
- #history-legend {
468
- text-align: center;
469
- }
470
- }
471
441
  /* Beacon
472
442
  ********************************** */
473
443
 
@@ -502,7 +472,7 @@ div.interval-slider input {
502
472
 
503
473
  @keyframes beacon-dot-pulse {
504
474
  from {
505
- background-color: #80002d;
475
+ background-color: #50002d;
506
476
  box-shadow: 0 0 9px #666;
507
477
  }
508
478
  50% {
@@ -510,7 +480,7 @@ div.interval-slider input {
510
480
  box-shadow: 0 0 18px #666;
511
481
  }
512
482
  to {
513
- background-color: #80002d;
483
+ background-color: #50002d;
514
484
  box-shadow: 0 0 9px #666;
515
485
  }
516
486
  }
@@ -549,7 +519,6 @@ div.interval-slider input {
549
519
  }
550
520
 
551
521
  .history-graph {
552
- font-size: 0.8em;
553
522
  padding: 3px;
554
523
  border-radius: 3px;
555
524
  }
@@ -628,330 +597,6 @@ div.interval-slider input {
628
597
  }
629
598
  }
630
599
 
631
- .rickshaw_graph .detail {
632
- pointer-events: none;
633
- position: absolute;
634
- top: 0;
635
- z-index: 2;
636
- background: rgba(0, 0, 0, .1);
637
- bottom: 0;
638
- width: 1px;
639
- transition: opacity .25s linear;
640
- }
641
- .rickshaw_graph .detail.inactive {
642
- opacity: 0
643
- }
644
- .rickshaw_graph .detail .item.active {
645
- opacity: 1
646
- }
647
- .rickshaw_graph .detail .x_label {
648
- font-family: Arial, sans-serif;
649
- border-radius: 3px;
650
- padding: 6px;
651
- opacity: .7;
652
- border: 1px solid #e0e0e0;
653
- font-size: 12px;
654
- position: absolute;
655
- background: #fff;
656
- white-space: nowrap
657
- }
658
- .rickshaw_graph .detail .x_label.left {
659
- left: 0
660
- }
661
- .rickshaw_graph .detail .x_label.right {
662
- right: 0
663
- }
664
- .rickshaw_graph .detail .item {
665
- position: absolute;
666
- z-index: 2;
667
- border-radius: 3px;
668
- padding: .25em;
669
- font-size: 12px;
670
- font-family: Arial, sans-serif;
671
- opacity: 0;
672
- background: rgba(0, 0, 0, .4);
673
- color: #fff;
674
- border: 1px solid rgba(0, 0, 0, .4);
675
- margin-left: 1em;
676
- margin-right: 1em;
677
- margin-top: -1em;
678
- white-space: nowrap
679
- }
680
- .rickshaw_graph .detail .item.left {
681
- left: 0
682
- }
683
- .rickshaw_graph .detail .item.right {
684
- right: 0
685
- }
686
- .rickshaw_graph .detail .item.active {
687
- opacity: 1;
688
- background: rgba(0, 0, 0, .8)
689
- }
690
- .rickshaw_graph .detail .item:after {
691
- position: absolute;
692
- display: block;
693
- width: 0;
694
- height: 0;
695
- content: "";
696
- border: 5px solid transparent
697
- }
698
- .rickshaw_graph .detail .item.left:after {
699
- top: 1em;
700
- left: -5px;
701
- margin-top: -5px;
702
- border-right-color: rgba(0, 0, 0, .8);
703
- border-left-width: 0
704
- }
705
- .rickshaw_graph .detail .item.right:after {
706
- top: 1em;
707
- right: -5px;
708
- margin-top: -5px;
709
- border-left-color: rgba(0, 0, 0, .8);
710
- border-right-width: 0
711
- }
712
- .rickshaw_graph .detail .dot {
713
- width: 4px;
714
- height: 4px;
715
- margin-left: -3px;
716
- margin-top: -3.5px;
717
- border-radius: 5px;
718
- position: absolute;
719
- box-shadow: 0 0 2px rgba(0, 0, 0, .6);
720
- box-sizing: content-box;
721
- background: #fff;
722
- border-width: 2px;
723
- border-style: solid;
724
- display: none;
725
- background-clip: padding-box
726
- }
727
- .rickshaw_graph .detail .dot.active {
728
- display: block
729
- }
730
- .rickshaw_graph {
731
- position: relative
732
- }
733
- .rickshaw_graph svg {
734
- display: block;
735
- overflow: hidden
736
- }
737
- .rickshaw_graph .x_tick {
738
- position: absolute;
739
- top: 0;
740
- bottom: 0;
741
- width: 0;
742
- border-left: 1px dotted rgba(0, 0, 0, .2);
743
- pointer-events: none
744
- }
745
- .rickshaw_graph .x_tick .title {
746
- position: absolute;
747
- font-size: 12px;
748
- font-family: Arial, sans-serif;
749
- opacity: .5;
750
- white-space: nowrap;
751
- margin-left: 3px;
752
- bottom: 1px
753
- }
754
- .rickshaw_annotation_timeline {
755
- height: 1px;
756
- border-top: 1px solid #e0e0e0;
757
- margin-top: 10px;
758
- position: relative
759
- }
760
- .rickshaw_annotation_timeline .annotation {
761
- position: absolute;
762
- height: 6px;
763
- width: 6px;
764
- margin-left: -2px;
765
- top: -3px;
766
- border-radius: 5px;
767
- background-color: rgba(0, 0, 0, .25)
768
- }
769
- .rickshaw_graph .annotation_line {
770
- position: absolute;
771
- top: 0;
772
- bottom: -6px;
773
- width: 0;
774
- border-left: 2px solid rgba(0, 0, 0, .3);
775
- display: none
776
- }
777
- .rickshaw_graph .annotation_line.active {
778
- display: block
779
- }
780
- .rickshaw_graph .annotation_range {
781
- background: rgba(0, 0, 0, .1);
782
- display: none;
783
- position: absolute;
784
- top: 0;
785
- bottom: -6px
786
- }
787
- .rickshaw_graph .annotation_range.active {
788
- display: block
789
- }
790
- .rickshaw_graph .annotation_range.active.offscreen {
791
- display: none
792
- }
793
- .rickshaw_annotation_timeline .annotation .content {
794
- background: #fff;
795
- color: #000;
796
- opacity: .9;
797
- padding: 5px;
798
- box-shadow: 0 0 2px rgba(0, 0, 0, .8);
799
- border-radius: 3px;
800
- position: relative;
801
- z-index: 20;
802
- font-size: 12px;
803
- padding: 6px 8px 8px;
804
- top: 18px;
805
- left: -11px;
806
- width: 160px;
807
- display: none;
808
- cursor: pointer
809
- }
810
- .rickshaw_annotation_timeline .annotation .content:before {
811
- content: "\25b2";
812
- position: absolute;
813
- top: -11px;
814
- color: #fff;
815
- text-shadow: 0 -1px 1px rgba(0, 0, 0, .8)
816
- }
817
- .rickshaw_annotation_timeline .annotation.active,
818
- .rickshaw_annotation_timeline .annotation:hover {
819
- background-color: rgba(0, 0, 0, .8);
820
- cursor: none
821
- }
822
- .rickshaw_annotation_timeline .annotation .content:hover {
823
- z-index: 50
824
- }
825
- .rickshaw_annotation_timeline .annotation.active .content {
826
- display: block
827
- }
828
- .rickshaw_annotation_timeline .annotation:hover .content {
829
- display: block;
830
- z-index: 50
831
- }
832
- .rickshaw_graph .y_axis,
833
- .rickshaw_graph .x_axis_d3 {
834
- fill: none
835
- }
836
- .rickshaw_graph .y_ticks .tick line,
837
- .rickshaw_graph .x_ticks_d3 .tick {
838
- stroke: rgba(0, 0, 0, .16);
839
- stroke-width: 2px;
840
- shape-rendering: crisp-edges;
841
- pointer-events: none
842
- }
843
- .rickshaw_graph .y_grid .tick,
844
- .rickshaw_graph .x_grid_d3 .tick {
845
- z-index: -1;
846
- stroke: rgba(0, 0, 0, .2);
847
- stroke-width: 1px;
848
- stroke-dasharray: 1 1
849
- }
850
- .rickshaw_graph .y_grid .tick[data-y-value="0"] {
851
- stroke-dasharray: 1 0
852
- }
853
- .rickshaw_graph .y_grid path,
854
- .rickshaw_graph .x_grid_d3 path {
855
- fill: none;
856
- stroke: none
857
- }
858
- .rickshaw_graph .y_ticks path,
859
- .rickshaw_graph .x_ticks_d3 path {
860
- fill: none;
861
- stroke: gray
862
- }
863
- .rickshaw_graph .y_ticks text,
864
- .rickshaw_graph .x_ticks_d3 text {
865
- opacity: .7;
866
- font-size: 12px;
867
- pointer-events: none
868
- }
869
- .rickshaw_graph .x_tick.glow .title,
870
- .rickshaw_graph .y_ticks.glow text {
871
- fill: #000;
872
- color: #000;
873
- text-shadow: -1px 1px 0 rgba(255, 255, 255, .1), 1px -1px 0 rgba(255, 255, 255, .1), 1px 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1), 0 -1px 0 rgba(255, 255, 255, .1), 1px 0 0 rgba(255, 255, 255, .1), -1px 0 0 rgba(255, 255, 255, .1), -1px -1px 0 rgba(255, 255, 255, .1)
874
- }
875
- .rickshaw_graph .x_tick.inverse .title,
876
- .rickshaw_graph .y_ticks.inverse text {
877
- fill: #fff;
878
- color: #fff;
879
- text-shadow: -1px 1px 0 rgba(0, 0, 0, .8), 1px -1px 0 rgba(0, 0, 0, .8), 1px 1px 0 rgba(0, 0, 0, .8), 0 1px 0 rgba(0, 0, 0, .8), 0 -1px 0 rgba(0, 0, 0, .8), 1px 0 0 rgba(0, 0, 0, .8), -1px 0 0 rgba(0, 0, 0, .8), -1px -1px 0 rgba(0, 0, 0, .8)
880
- }
881
- .rickshaw_legend {
882
- font-family: Arial;
883
- font-size: 12px;
884
- color: #fff;
885
- background: #404040;
886
- display: inline-block;
887
- padding: 12px 5px;
888
- border-radius: 2px;
889
- position: relative
890
- }
891
- .rickshaw_legend:hover {
892
- z-index: 10
893
- }
894
- .rickshaw_legend .swatch {
895
- width: 10px;
896
- height: 10px;
897
- border: 1px solid rgba(0, 0, 0, .2)
898
- }
899
- .rickshaw_legend .line {
900
- clear: both;
901
- line-height: 140%;
902
- padding-right: 15px
903
- }
904
- .rickshaw_legend .line .swatch {
905
- display: inline-block;
906
- margin-right: 3px;
907
- border-radius: 2px
908
- }
909
- .rickshaw_legend .label {
910
- margin: 0;
911
- white-space: nowrap;
912
- display: inline;
913
- font-size: inherit;
914
- background-color: transparent;
915
- color: inherit;
916
- font-weight: 400;
917
- line-height: normal;
918
- padding: 0;
919
- text-shadow: none
920
- }
921
- .rickshaw_legend .action:hover {
922
- opacity: .6
923
- }
924
- .rickshaw_legend .action {
925
- margin-right: .2em;
926
- font-size: 10px;
927
- opacity: .2;
928
- cursor: pointer;
929
- font-size: 14px
930
- }
931
- .rickshaw_legend .line.disabled {
932
- opacity: .4
933
- }
934
- .rickshaw_legend ul {
935
- list-style-type: none;
936
- margin: 0;
937
- padding: 0;
938
- margin: 2px;
939
- cursor: pointer
940
- }
941
- .rickshaw_legend li {
942
- padding: 0 0 0 2px;
943
- min-width: 80px;
944
- white-space: nowrap
945
- }
946
- .rickshaw_legend li:hover {
947
- background: rgba(255, 255, 255, .08);
948
- border-radius: 3px
949
- }
950
- .rickshaw_legend li:active {
951
- background: rgba(255, 255, 255, .2);
952
- border-radius: 3px
953
- }
954
-
955
600
  .code-wrap {
956
601
  white-space: normal;
957
602
  }
@@ -979,37 +624,25 @@ div.interval-slider input {
979
624
  }
980
625
  }
981
626
 
982
- .redis-url, .redis-namespace {
627
+ .redis-url {
983
628
  overflow: hidden;
984
629
  white-space: nowrap;
985
630
  }
986
631
 
987
632
  @media (min-width: 768px) {
988
633
  .redis-url {
989
- max-width: 200px;
990
- }
991
-
992
- .redis-namespace {
993
- max-width: 150px;
634
+ max-width: 250px;
994
635
  }
995
636
  }
996
637
 
997
638
  @media (min-width: 992px) {
998
639
  .redis-url {
999
- max-width: 390px;
1000
- }
1001
-
1002
- .redis-namespace {
1003
- max-width: 300px;
640
+ max-width: 490px;
1004
641
  }
1005
642
  }
1006
643
  @media (min-width: 1200px) {
1007
644
  .redis-url {
1008
- max-width: 480px;
1009
- }
1010
-
1011
- .redis-namespace {
1012
- max-width: 350px;
645
+ max-width: 600px;
1013
646
  }
1014
647
  }
1015
648
 
@@ -1043,11 +676,49 @@ div.interval-slider input {
1043
676
  }
1044
677
 
1045
678
  .info-circle {
1046
- color: #ccc;
1047
- background-color: #000;
679
+ color: #333;
680
+ background-color: #ccc;
1048
681
  border-radius: 50%;
1049
682
  text-align: center;
1050
683
  vertical-align: middle;
1051
684
  padding: 3px 7px;
1052
685
  margin-left: 5px;
1053
686
  }
687
+
688
+ .metrics-swatch-wrapper {
689
+ display: flex;
690
+ align-items: center;
691
+ gap: 6px;
692
+ }
693
+
694
+ .metrics-swatch[type=checkbox] {
695
+ display: inline-block;
696
+ width: 16px;
697
+ height: 16px;
698
+ margin: 0;
699
+ border-radius: 2px;
700
+ appearance: none;
701
+ -webkit-appearance: none;
702
+ -moz-appearance: none;
703
+ border: 1px solid #bbb;
704
+ color: white;
705
+ background-color: currentColor;
706
+ }
707
+
708
+ /* We need to add the checkmark since we've taken over the appearance */
709
+ .metrics-swatch[type=checkbox]:checked {
710
+ border-color: currentColor;
711
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
712
+ background-size: 100% 100%;
713
+ background-position: center;
714
+ background-repeat: no-repeat;
715
+ }
716
+
717
+ .metrics-swatch[type=checkbox]:focus {
718
+ outline: 1px solid #888;
719
+ outline-offset: 2px;
720
+ }
721
+
722
+ canvas {
723
+ margin: 20px 0 30px;
724
+ }