rails-profiler 0.11.0 → 0.12.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/app/assets/builds/profiler.css +318 -0
- data/app/assets/builds/profiler.js +466 -14
- data/app/controllers/profiler/api/function_profiling_controller.rb +32 -0
- data/config/routes.rb +1 -0
- data/lib/profiler/collectors/function_profiler_collector.rb +228 -0
- data/lib/profiler/configuration.rb +15 -0
- data/lib/profiler/mcp/body_formatter.rb +12 -1
- data/lib/profiler/mcp/file_cache.rb +7 -4
- data/lib/profiler/models/profile.rb +17 -4
- data/lib/profiler/railtie.rb +2 -3
- data/lib/profiler/storage/file_store.rb +1 -5
- data/lib/profiler/storage/sqlite_store.rb +2 -10
- data/lib/profiler/version.rb +1 -1
- data/lib/profiler.rb +6 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b25edc08059907d5374748ac0624d804685b83189faabc4bae8b19cc65b0bed9
|
|
4
|
+
data.tar.gz: a5e8268d4e59540a91d7fc2b27c44bbb492e221e2ac2f4446c2ad095a2473245
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: af7137fb8650d7a40d2291ad66dc4fe25466c77ad2ebb83489f15191114a1a290b6a4eb47e5760744e991212ec0ed05a146d1d9450f4c7d7cbcbd394629ae3b1
|
|
7
|
+
data.tar.gz: 197f4016c350ed157b690d52ff44c83ef4ef2c5ae69f7906ad55ec8b44416fb606e41b66e3d0d84124ec378cb2961ac0b6c8bcde08e55c1e45c488648889cea8
|
|
@@ -2524,6 +2524,324 @@ a.profiler-toolbar-item.profiler-text--warning::after {
|
|
|
2524
2524
|
overflow: hidden;
|
|
2525
2525
|
}
|
|
2526
2526
|
|
|
2527
|
+
.profiler-fn-profiling {
|
|
2528
|
+
margin-top: 32px;
|
|
2529
|
+
border-top: 1px solid var(--profiler-border);
|
|
2530
|
+
padding-top: 24px;
|
|
2531
|
+
animation: fadeIn 300ms ease;
|
|
2532
|
+
}
|
|
2533
|
+
.profiler-fn-profiling__header {
|
|
2534
|
+
display: flex;
|
|
2535
|
+
align-items: center;
|
|
2536
|
+
justify-content: space-between;
|
|
2537
|
+
gap: 16px;
|
|
2538
|
+
margin-bottom: 16px;
|
|
2539
|
+
flex-wrap: wrap;
|
|
2540
|
+
}
|
|
2541
|
+
.profiler-fn-profiling__title {
|
|
2542
|
+
font-size: var(--profiler-text-xs);
|
|
2543
|
+
font-weight: 700;
|
|
2544
|
+
letter-spacing: 0.12em;
|
|
2545
|
+
text-transform: uppercase;
|
|
2546
|
+
color: var(--profiler-text-muted);
|
|
2547
|
+
font-family: var(--profiler-font-sans);
|
|
2548
|
+
display: flex;
|
|
2549
|
+
align-items: center;
|
|
2550
|
+
gap: 8px;
|
|
2551
|
+
}
|
|
2552
|
+
.profiler-fn-profiling__title::before {
|
|
2553
|
+
content: "";
|
|
2554
|
+
display: inline-block;
|
|
2555
|
+
width: 8px;
|
|
2556
|
+
height: 8px;
|
|
2557
|
+
border-radius: 50%;
|
|
2558
|
+
background: #94a3b8;
|
|
2559
|
+
flex-shrink: 0;
|
|
2560
|
+
}
|
|
2561
|
+
.profiler-fn-profiling__title--active::before {
|
|
2562
|
+
background: var(--profiler-accent);
|
|
2563
|
+
box-shadow: 0 0 6px var(--profiler-accent-glow);
|
|
2564
|
+
}
|
|
2565
|
+
.profiler-fn-profiling__controls {
|
|
2566
|
+
display: flex;
|
|
2567
|
+
align-items: center;
|
|
2568
|
+
gap: 12px;
|
|
2569
|
+
flex-wrap: wrap;
|
|
2570
|
+
}
|
|
2571
|
+
.profiler-fn-profiling__max-frames-label {
|
|
2572
|
+
display: flex;
|
|
2573
|
+
align-items: center;
|
|
2574
|
+
gap: 6px;
|
|
2575
|
+
font-size: var(--profiler-text-xs);
|
|
2576
|
+
color: var(--profiler-text-muted);
|
|
2577
|
+
font-family: var(--profiler-font-sans);
|
|
2578
|
+
cursor: default;
|
|
2579
|
+
}
|
|
2580
|
+
.profiler-fn-profiling__max-frames-input {
|
|
2581
|
+
width: 70px;
|
|
2582
|
+
height: 26px;
|
|
2583
|
+
padding: 0 8px;
|
|
2584
|
+
background: var(--profiler-bg-lighter);
|
|
2585
|
+
border: 1px solid var(--profiler-border);
|
|
2586
|
+
border-radius: var(--profiler-radius-sm);
|
|
2587
|
+
color: var(--profiler-text);
|
|
2588
|
+
font-family: var(--profiler-font-mono);
|
|
2589
|
+
font-size: var(--profiler-text-xs);
|
|
2590
|
+
text-align: center;
|
|
2591
|
+
transition: border-color var(--profiler-transition-base);
|
|
2592
|
+
appearance: textfield;
|
|
2593
|
+
}
|
|
2594
|
+
.profiler-fn-profiling__max-frames-input::-webkit-inner-spin-button, .profiler-fn-profiling__max-frames-input::-webkit-outer-spin-button {
|
|
2595
|
+
-webkit-appearance: none;
|
|
2596
|
+
}
|
|
2597
|
+
.profiler-fn-profiling__max-frames-input:focus {
|
|
2598
|
+
outline: none;
|
|
2599
|
+
border-color: var(--profiler-accent);
|
|
2600
|
+
box-shadow: 0 0 0 2px var(--profiler-accent-glow);
|
|
2601
|
+
}
|
|
2602
|
+
.profiler-fn-profiling__max-frames-input:disabled {
|
|
2603
|
+
opacity: 0.4;
|
|
2604
|
+
cursor: not-allowed;
|
|
2605
|
+
}
|
|
2606
|
+
.profiler-fn-profiling__updating {
|
|
2607
|
+
font-size: var(--profiler-text-xs);
|
|
2608
|
+
color: var(--profiler-text-muted);
|
|
2609
|
+
font-family: var(--profiler-font-mono);
|
|
2610
|
+
animation: pulse 1s ease-in-out infinite;
|
|
2611
|
+
}
|
|
2612
|
+
.profiler-fn-profiling__toggle {
|
|
2613
|
+
display: inline-flex;
|
|
2614
|
+
align-items: center;
|
|
2615
|
+
gap: 6px;
|
|
2616
|
+
height: 28px;
|
|
2617
|
+
padding: 0 14px;
|
|
2618
|
+
border-radius: var(--profiler-radius-full);
|
|
2619
|
+
border: 1px solid var(--profiler-border-strong);
|
|
2620
|
+
background: var(--profiler-bg-lighter);
|
|
2621
|
+
color: var(--profiler-text-muted);
|
|
2622
|
+
font-size: var(--profiler-text-xs);
|
|
2623
|
+
font-weight: 600;
|
|
2624
|
+
font-family: var(--profiler-font-sans);
|
|
2625
|
+
cursor: pointer;
|
|
2626
|
+
transition: all var(--profiler-transition-base);
|
|
2627
|
+
white-space: nowrap;
|
|
2628
|
+
}
|
|
2629
|
+
.profiler-fn-profiling__toggle::before {
|
|
2630
|
+
content: "";
|
|
2631
|
+
width: 6px;
|
|
2632
|
+
height: 6px;
|
|
2633
|
+
border-radius: 50%;
|
|
2634
|
+
background: var(--profiler-text-subtle);
|
|
2635
|
+
flex-shrink: 0;
|
|
2636
|
+
transition: background var(--profiler-transition-base), box-shadow var(--profiler-transition-base);
|
|
2637
|
+
}
|
|
2638
|
+
.profiler-fn-profiling__toggle:hover {
|
|
2639
|
+
border-color: var(--profiler-border-strong);
|
|
2640
|
+
color: var(--profiler-text);
|
|
2641
|
+
background: var(--profiler-bg-elevated);
|
|
2642
|
+
}
|
|
2643
|
+
.profiler-fn-profiling__toggle:disabled {
|
|
2644
|
+
opacity: 0.5;
|
|
2645
|
+
cursor: not-allowed;
|
|
2646
|
+
}
|
|
2647
|
+
.profiler-fn-profiling__toggle--active {
|
|
2648
|
+
border-color: var(--profiler-border-accent);
|
|
2649
|
+
background: var(--profiler-accent-bg);
|
|
2650
|
+
color: var(--profiler-accent);
|
|
2651
|
+
}
|
|
2652
|
+
.profiler-fn-profiling__toggle--active::before {
|
|
2653
|
+
background: var(--profiler-accent);
|
|
2654
|
+
box-shadow: 0 0 6px var(--profiler-accent-glow);
|
|
2655
|
+
}
|
|
2656
|
+
.profiler-fn-profiling__toggle--active:hover {
|
|
2657
|
+
background: rgba(245, 158, 11, 0.15);
|
|
2658
|
+
}
|
|
2659
|
+
.profiler-fn-profiling__hint {
|
|
2660
|
+
margin: 12px 0 0;
|
|
2661
|
+
padding: 10px 14px;
|
|
2662
|
+
background: var(--profiler-bg-lighter);
|
|
2663
|
+
border: 1px solid var(--profiler-border);
|
|
2664
|
+
border-radius: var(--profiler-radius-md);
|
|
2665
|
+
font-size: var(--profiler-text-xs);
|
|
2666
|
+
color: var(--profiler-text-muted);
|
|
2667
|
+
font-family: var(--profiler-font-sans);
|
|
2668
|
+
line-height: 1.6;
|
|
2669
|
+
}
|
|
2670
|
+
.profiler-fn-profiling__flamegraph {
|
|
2671
|
+
margin: 16px 0;
|
|
2672
|
+
}
|
|
2673
|
+
.profiler-fn-profiling__flamegraph .profiler-flamegraph__controls {
|
|
2674
|
+
margin-bottom: 6px;
|
|
2675
|
+
}
|
|
2676
|
+
.profiler-fn-profiling__sort {
|
|
2677
|
+
display: flex;
|
|
2678
|
+
align-items: center;
|
|
2679
|
+
gap: 4px;
|
|
2680
|
+
margin: 16px 0 8px;
|
|
2681
|
+
padding: 3px;
|
|
2682
|
+
background: var(--profiler-bg-lighter);
|
|
2683
|
+
border: 1px solid var(--profiler-border);
|
|
2684
|
+
border-radius: var(--profiler-radius-md);
|
|
2685
|
+
width: fit-content;
|
|
2686
|
+
}
|
|
2687
|
+
.profiler-fn-profiling__sort-btn {
|
|
2688
|
+
padding: 4px 12px;
|
|
2689
|
+
border: none;
|
|
2690
|
+
border-radius: var(--profiler-radius-sm);
|
|
2691
|
+
background: transparent;
|
|
2692
|
+
color: var(--profiler-text-muted);
|
|
2693
|
+
font-size: var(--profiler-text-xs);
|
|
2694
|
+
font-weight: 500;
|
|
2695
|
+
font-family: var(--profiler-font-sans);
|
|
2696
|
+
cursor: pointer;
|
|
2697
|
+
transition: all var(--profiler-transition-fast);
|
|
2698
|
+
white-space: nowrap;
|
|
2699
|
+
}
|
|
2700
|
+
.profiler-fn-profiling__sort-btn:hover {
|
|
2701
|
+
color: var(--profiler-text);
|
|
2702
|
+
background: var(--profiler-bg-elevated);
|
|
2703
|
+
}
|
|
2704
|
+
.profiler-fn-profiling__sort-btn--active {
|
|
2705
|
+
background: var(--profiler-accent);
|
|
2706
|
+
color: var(--profiler-text-on-accent);
|
|
2707
|
+
font-weight: 600;
|
|
2708
|
+
box-shadow: var(--profiler-shadow-sm);
|
|
2709
|
+
}
|
|
2710
|
+
.profiler-fn-profiling__sort-btn--active:hover {
|
|
2711
|
+
background: var(--profiler-accent-hover);
|
|
2712
|
+
color: var(--profiler-text-on-accent);
|
|
2713
|
+
}
|
|
2714
|
+
.profiler-fn-profiling__table {
|
|
2715
|
+
width: 100%;
|
|
2716
|
+
border-collapse: collapse;
|
|
2717
|
+
font-size: var(--profiler-text-xs);
|
|
2718
|
+
font-family: var(--profiler-font-sans);
|
|
2719
|
+
margin-top: 8px;
|
|
2720
|
+
}
|
|
2721
|
+
.profiler-fn-profiling__table thead tr {
|
|
2722
|
+
border-bottom: 1px solid var(--profiler-border-strong);
|
|
2723
|
+
}
|
|
2724
|
+
.profiler-fn-profiling__table th {
|
|
2725
|
+
padding: 8px 10px;
|
|
2726
|
+
text-align: left;
|
|
2727
|
+
font-size: var(--profiler-text-xs);
|
|
2728
|
+
font-weight: 600;
|
|
2729
|
+
letter-spacing: 0.08em;
|
|
2730
|
+
text-transform: uppercase;
|
|
2731
|
+
color: var(--profiler-text-subtle);
|
|
2732
|
+
}
|
|
2733
|
+
.profiler-fn-profiling__table th.profiler-text--right {
|
|
2734
|
+
text-align: right;
|
|
2735
|
+
}
|
|
2736
|
+
.profiler-fn-profiling__table tbody tr {
|
|
2737
|
+
border-bottom: 1px solid var(--profiler-border);
|
|
2738
|
+
transition: background var(--profiler-transition-fast);
|
|
2739
|
+
}
|
|
2740
|
+
.profiler-fn-profiling__table tbody tr:hover {
|
|
2741
|
+
background: var(--profiler-bg-lighter);
|
|
2742
|
+
}
|
|
2743
|
+
.profiler-fn-profiling__table tbody tr:last-child {
|
|
2744
|
+
border-bottom: none;
|
|
2745
|
+
}
|
|
2746
|
+
.profiler-fn-profiling__table tbody tr.profiler-fn-profiling__row--highlighted {
|
|
2747
|
+
background: rgba(251, 191, 36, 0.08);
|
|
2748
|
+
outline: 1px solid rgba(251, 191, 36, 0.35);
|
|
2749
|
+
outline-offset: -1px;
|
|
2750
|
+
}
|
|
2751
|
+
.profiler-fn-profiling__table td {
|
|
2752
|
+
padding: 7px 10px;
|
|
2753
|
+
vertical-align: middle;
|
|
2754
|
+
line-height: 1.4;
|
|
2755
|
+
}
|
|
2756
|
+
.profiler-fn-profiling__table td.profiler-text--right {
|
|
2757
|
+
text-align: right;
|
|
2758
|
+
}
|
|
2759
|
+
.profiler-fn-profiling__table td.profiler-text--muted {
|
|
2760
|
+
color: var(--profiler-text-muted);
|
|
2761
|
+
}
|
|
2762
|
+
.profiler-fn-profiling__name {
|
|
2763
|
+
font-family: var(--profiler-font-mono);
|
|
2764
|
+
font-size: var(--profiler-text-xs);
|
|
2765
|
+
font-weight: 500;
|
|
2766
|
+
color: var(--profiler-text);
|
|
2767
|
+
max-width: 280px;
|
|
2768
|
+
overflow: hidden;
|
|
2769
|
+
text-overflow: ellipsis;
|
|
2770
|
+
white-space: nowrap;
|
|
2771
|
+
}
|
|
2772
|
+
.profiler-fn-profiling__recursive {
|
|
2773
|
+
display: inline-flex;
|
|
2774
|
+
align-items: center;
|
|
2775
|
+
justify-content: center;
|
|
2776
|
+
width: 14px;
|
|
2777
|
+
height: 14px;
|
|
2778
|
+
border-radius: 3px;
|
|
2779
|
+
background: var(--profiler-warning-bg);
|
|
2780
|
+
color: var(--profiler-warning);
|
|
2781
|
+
font-size: 9px;
|
|
2782
|
+
font-weight: 700;
|
|
2783
|
+
margin-right: 5px;
|
|
2784
|
+
vertical-align: middle;
|
|
2785
|
+
flex-shrink: 0;
|
|
2786
|
+
cursor: help;
|
|
2787
|
+
}
|
|
2788
|
+
.profiler-fn-profiling__filter-active {
|
|
2789
|
+
display: flex;
|
|
2790
|
+
align-items: center;
|
|
2791
|
+
justify-content: space-between;
|
|
2792
|
+
gap: 8px;
|
|
2793
|
+
margin: 12px 0 0;
|
|
2794
|
+
padding: 8px 14px;
|
|
2795
|
+
background: var(--profiler-accent-bg);
|
|
2796
|
+
border: 1px solid var(--profiler-border-accent);
|
|
2797
|
+
border-radius: var(--profiler-radius-md);
|
|
2798
|
+
font-size: var(--profiler-text-xs);
|
|
2799
|
+
color: var(--profiler-accent);
|
|
2800
|
+
font-family: var(--profiler-font-sans);
|
|
2801
|
+
}
|
|
2802
|
+
.profiler-fn-profiling__filter-active strong {
|
|
2803
|
+
font-family: var(--profiler-font-mono);
|
|
2804
|
+
font-weight: 600;
|
|
2805
|
+
}
|
|
2806
|
+
.profiler-fn-profiling__filter-clear {
|
|
2807
|
+
padding: 2px 8px;
|
|
2808
|
+
border: 1px solid var(--profiler-border-accent);
|
|
2809
|
+
border-radius: var(--profiler-radius-sm);
|
|
2810
|
+
background: transparent;
|
|
2811
|
+
color: var(--profiler-accent);
|
|
2812
|
+
font-size: var(--profiler-text-xs);
|
|
2813
|
+
font-family: var(--profiler-font-sans);
|
|
2814
|
+
cursor: pointer;
|
|
2815
|
+
transition: all var(--profiler-transition-fast);
|
|
2816
|
+
white-space: nowrap;
|
|
2817
|
+
}
|
|
2818
|
+
.profiler-fn-profiling__filter-clear:hover {
|
|
2819
|
+
background: var(--profiler-accent);
|
|
2820
|
+
color: var(--profiler-text-on-accent);
|
|
2821
|
+
}
|
|
2822
|
+
.profiler-fn-profiling__cap-warning {
|
|
2823
|
+
display: flex;
|
|
2824
|
+
align-items: center;
|
|
2825
|
+
gap: 8px;
|
|
2826
|
+
margin: 12px 0 0;
|
|
2827
|
+
padding: 10px 14px;
|
|
2828
|
+
background: var(--profiler-warning-bg);
|
|
2829
|
+
border: 1px solid rgba(251, 146, 60, 0.3);
|
|
2830
|
+
border-radius: var(--profiler-radius-md);
|
|
2831
|
+
font-size: var(--profiler-text-xs);
|
|
2832
|
+
color: var(--profiler-warning);
|
|
2833
|
+
font-family: var(--profiler-font-sans);
|
|
2834
|
+
font-weight: 500;
|
|
2835
|
+
}
|
|
2836
|
+
|
|
2837
|
+
@keyframes pulse {
|
|
2838
|
+
0%, 100% {
|
|
2839
|
+
opacity: 1;
|
|
2840
|
+
}
|
|
2841
|
+
50% {
|
|
2842
|
+
opacity: 0.4;
|
|
2843
|
+
}
|
|
2844
|
+
}
|
|
2527
2845
|
pre[data-language=sql],
|
|
2528
2846
|
.sql-code {
|
|
2529
2847
|
background: var(--profiler-bg);
|