Exemple #1
0
/*
 * Module load callback
 */
void
_PG_init(void)
{
    
    /* */
    if (!process_shared_preload_libraries_in_progress)
        return;
    
    /* Define custom GUC variables. */
    DefineCustomBoolVariable("query_histogram.dynamic",
                              "Dynamic histogram may be modified on the fly.",
                             NULL,
                             &default_histogram_dynamic,
                             false,
                             PGC_BACKEND,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             NULL,
                             NULL);
    
    /* Define custom GUC variables. */
    DefineCustomBoolVariable("query_histogram.track_utility",
                              "Selects whether utility commands are tracked.",
                             NULL,
                             &default_histogram_utility,
                             true,
                             PGC_SUSET,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             &set_histogram_track_utility,
                             NULL);
    
    DefineCustomIntVariable("query_histogram.bin_count",
                         "Sets the number of bins of the histogram.",
                         "Zero disables collecting the histogram.",
                            &default_histogram_bins,
                            100,
                            0, 1000,
                            PGC_SUSET,
                            0,
#if (PG_VERSION_NUM >= 90100)
                            NULL,
#endif
                            &set_histogram_bins_count_hook,
                            NULL);
    
    DefineCustomIntVariable("query_histogram.bin_width",
                         "Sets the width of the histogram bin.",
                            NULL,
                            &default_histogram_step,
                            100,
                            1, 1000,
                            PGC_SUSET,
                            GUC_UNIT_MS,
#if (PG_VERSION_NUM >= 90100)
                            NULL,
#endif
                            &set_histogram_bins_width_hook,
                            NULL);
    
    DefineCustomIntVariable("query_histogram.sample_pct",
                         "What portion of the queries should be sampled (in percent).",
                            NULL,
                            &default_histogram_sample_pct,
                            5,
                            1, 100,
                            PGC_SUSET,
                            0,
#if (PG_VERSION_NUM >= 90100)
                            NULL,
#endif
                            &set_histogram_sample_hook,
                            NULL);

    DefineCustomEnumVariable("query_histogram.histogram_type",
                             "Type of the histogram (how the bin width is computed).",
                             NULL,
                             &default_histogram_type,
                             HISTOGRAM_LINEAR,
                             histogram_type_options,
                             PGC_SUSET,
                             0,
#if (PG_VERSION_NUM >= 90100)
                             NULL,
#endif
                             &set_histogram_type_hook,
                             NULL);

    EmitWarningsOnPlaceholders("query_histogram");
    
    /*
     * Request additional shared resources.  (These are no-ops if we're not in
     * the postmaster process.)  We'll allocate or attach to the shared
     * resources in histogram_shmem_startup().
     */
    RequestAddinShmemSpace(get_histogram_size());
    RequestAddinLWLocks(1);

    /* Install hooks. */
    prev_shmem_startup_hook = shmem_startup_hook;
    shmem_startup_hook = histogram_shmem_startup;
    
    prev_ExecutorStart = ExecutorStart_hook;
    ExecutorStart_hook = explain_ExecutorStart;
    prev_ExecutorRun = ExecutorRun_hook;
    ExecutorRun_hook = explain_ExecutorRun;
#if (PG_VERSION_NUM >= 90100)
    prev_ExecutorFinish = ExecutorFinish_hook;
    ExecutorFinish_hook = explain_ExecutorFinish;
#endif
    prev_ExecutorEnd = ExecutorEnd_hook;
    ExecutorEnd_hook = explain_ExecutorEnd;
    prev_ProcessUtility = ProcessUtility_hook;
    ProcessUtility_hook = queryhist_ProcessUtility;

}
Exemple #2
0
/*
 * Module load callback
 */
void
_PG_init(void)
{

	/*
	 * In order to create our shared memory area, we have to be loaded via
	 * shared_preload_libraries.  If not, fall out without hooking into any of
	 * the main system.  (We don't throw error here because it seems useful to
	 * allow the query_histogram functions to be created even when the
	 * module isn't active.  The functions must protect themselves against
	 * being called then, however.)
	 */
	if (!process_shared_preload_libraries_in_progress)
		return;

	/* Define custom GUC variables. */
	DefineCustomBoolVariable("query_histogram.dynamic",
							  "Dynamic histogram may be modified on the fly.",
							 NULL,
							 &default_histogram_dynamic,
							 false,
							 PGC_BACKEND,
							 0,
							 NULL,
							 NULL,
							 NULL);

	/* Define custom GUC variables. */
	DefineCustomBoolVariable("query_histogram.track_utility",
							  "Selects whether utility commands are tracked.",
							 NULL,
							 &default_histogram_utility,
							 true,
							 PGC_SUSET,
							 0,
							 NULL,
							 &set_histogram_track_utility,
							 &show_histogram_track_utility);

	DefineCustomIntVariable("query_histogram.bin_count",
						 "Sets the number of bins of the histogram.",
						 "Zero disables collecting the histogram.",
							&default_histogram_bins,
							100,
							0, 1000,
							PGC_SUSET,
							0,
							NULL,
							&set_histogram_bins_count_hook,
							&show_histogram_bins_count_hook);

	DefineCustomIntVariable("query_histogram.bin_width",
						 "Sets the width of the histogram bin.",
							NULL,
							&default_histogram_step,
							100,
							1, 1000,
							PGC_SUSET,
							GUC_UNIT_MS,
							NULL,
							&set_histogram_bins_width_hook,
							&show_histogram_bins_width_hook);

	DefineCustomIntVariable("query_histogram.sample_pct",
						 "What portion of the queries should be sampled (in percent).",
							NULL,
							&default_histogram_sample_pct,
							5,
							1, 100,
							PGC_SUSET,
							0,
							NULL,
							&set_histogram_sample_hook,
							&show_histogram_sample_hook);

	DefineCustomEnumVariable("query_histogram.histogram_type",
							 "Type of the histogram (how the bin width is computed).",
							 NULL,
							 &default_histogram_type,
							 HISTOGRAM_LINEAR,
							 histogram_type_options,
							 PGC_SUSET,
							 0,
							 NULL,
							 &set_histogram_type_hook,
							 &show_histogram_type_hook);

	EmitWarningsOnPlaceholders("query_histogram");

	/*
	 * Request additional shared resources.  (These are no-ops if we're not in
	 * the postmaster process.)  We'll allocate or attach to the shared
	 * resources in histogram_shmem_startup().
	 */
	RequestAddinShmemSpace(get_histogram_size());
	RequestNamedLWLockTranche("query_histogram", 1);

	/* Install hooks. */
	prev_shmem_startup_hook = shmem_startup_hook;
	shmem_startup_hook = histogram_shmem_startup;

	prev_ExecutorStart = ExecutorStart_hook;
	ExecutorStart_hook = histogram_ExecutorStart;
	prev_ExecutorRun = ExecutorRun_hook;
	ExecutorRun_hook = histogram_ExecutorRun;
	prev_ExecutorFinish = ExecutorFinish_hook;
	ExecutorFinish_hook = histogram_ExecutorFinish;
	prev_ExecutorEnd = ExecutorEnd_hook;
	ExecutorEnd_hook = histogram_ExecutorEnd;
	prev_ProcessUtility = ProcessUtility_hook;
	ProcessUtility_hook = queryhist_ProcessUtility;
}