Difficulty with SP_TRACE_SETFILTER

  • Hi all,

    First off - Happy New Year - may 2005 be Blessed, Peaceful and Prosperous for you.

    To my problem, then.  I have extended the stored procedure to try and report on the creation of the traces inside, as opposed to external, in case the traceid was getting "lost" somehow.

    **********start code*************
    if exists (select 1 from sysobjects where name = 'Up_Auto_Profiler_Perf')
    drop procedure Up_Auto_Profiler_Perf
    go
    
    create procedure Up_Auto_Profiler_Perf 
    @TraceFile nvarchar(128),--Nvarchar as required by SP_CREATE_TRACE. The File to be created.
    @StopTime datetime,--The time to stop the trace.
    @MaxSize BigInt = 10,--BigInt as required by SP_CREATE_TRACE. The maximum size per file.
    @DurationFilterValueBIGINT, --The duration to filter on (in ms).
    @TraceID int OUTPUT
    
    --Create By:Regan Galbraith
    --Create On:2004-12-28
    --Purpose:
    --This stored procedure was written to facilitate the creation of profiler traces that write to files.
    --
    --Example:
    --exec Up_Auto_Profiler_Perf 'C:\TraceFiles\AutoProf_SP_20041228_1000','2004-12-28-10:05:00.000',100,500
    --
    --Possible future additions:
    --1> simple enhancement to specify DB to store data, and table.
    --2>accepting a parameter instead of apply the default .trc. Use the .trc as default
    --3>implementing default value's for dir's, so that it can run without parm's ... good or bad?
    --
    --Change Control:version 1 - Regan Galbraith 2004-12-28
    --Creation and adding of comment
    --version 1.2 - Regan Galbraith 2004-12-29
    --Added @DurationFilterValue logic to allow generation of limited data, 
    --filtering on duration
    --Added Output parametre @TracId to return for lookup on trace.
    --
    --
    
    
    AS
    --Declare Control Variable
    declare @ReturnCode Int
    
    --Declare Option Variables   
    declare @Option int
    declare @EventId int
    declare @On bit
    
    declare @Value int
    declare @ComparisonOperator int
    declare @ColumnId int
    declare @LogicalOperator int
    
    --Set Option Variable
    set @Option = 2--TraceFileRollOver 
    --Specifies that when the max_file_size is reached, the current trace file is closed and a new file is created.
    
    --Set Trace Filter to exclude System Ids - that is ObjectId > 100
    set @Value = 100  
    set @ColumnId = 22--0bjectid
    set @LogicalOperator = 0--and (1 = OR)
    set @ComparisonOperator = 2--Greater than
    
    --Set Control Variables
    set @ReturnCode = 0--No Error
    set @On = 1--True
    
    --Create a trace, retrieve @TraceId 
    exec sp_trace_create @TraceId output,@Option,@TraceFile,@MaxSize,@StopTime
    select @ReturnCode=@@Error
    if @ReturnCode <> 0
    Begin
    if @ReturnCode = 1
    Print 'Error 1 - Unknown error.'
    if @ReturnCode = 10
    Print 'Error 10 - Invalid options. Returned when options specified are incompatible.'
    if @ReturnCode = 12
    Print 'Error 12 - Cannot create tracefile - check if file already exists, or this trace already running'
    if @ReturnCode = 13
    Print 'Error 13 - Out of memory. Returned when there is not enough memory to perform the specified action.'
    if @ReturnCode = 14
    Print 'Error 14 - Invalid stop time. Returned when the stop time specified has already happened.'
    if @ReturnCode = 15
    Print 'Error 15 - Invalid parameters. Returned when the user supplied incompatible parameters.'
    else
    Print 'Unexpected and Unknown error In creating trace - Please review'
    Goto ErrorHandler
    End
    --Populate Trace with Events
    --SECTION CURSORS
    -- this set is : cursor execute
    set @EventId = 74
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    
    -- this set is : Cursor Open
    set @EventId = 53
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    
    -- this set is : Cursor Recompile
    set @EventId = 75
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    
    --SECTION ERRORS AND WARNINGS
    -- this set is : MissingJoinPredicate
    set @EventId = 80
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    
    --SECTION LOCKS 
    -- this set is : Lock: DeadLock
    set @EventId = 25
    exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    exec sp_trace_setevent @TraceId,@EventId,13,@On--duration
    exec sp_trace_setevent @TraceId,@EventId,15,@On--EndTime
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,24,@On--indexID
    exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    exec sp_trace_setevent @TraceId,@EventId,32,@On--Mode
    exec sp_trace_setevent @TraceId,@EventId,22,@On--ObjectID
    
    -- this set is : Lock: DeadLockChain
    set @EventId = 59
    exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,24,@On--indexID
    exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    exec sp_trace_setevent @TraceId,@EventId,32,@On--Mode
    exec sp_trace_setevent @TraceId,@EventId,22,@On--ObjectID
    
    -- this set is : Lock: Timeout
    set @EventId = 27
    exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    exec sp_trace_setevent @TraceId,@EventId,13,@On--duration
    exec sp_trace_setevent @TraceId,@EventId,15,@On--EndTime
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,24,@On--indexID
    exec sp_trace_setevent @TraceId,@EventId,32,@On--Mode
    exec sp_trace_setevent @TraceId,@EventId,22,@On--ObjectID
    
    --SECTION PERFORMANCE
    -- this set is : Execution Plan
    -- set @EventId = 68
    -- exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    -- exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    -- exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    -- exec sp_trace_setevent @TraceId,@EventId,22,@On--ObjectID
    -- exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    
    -- this set is : Show Plan
    set @EventId = 97
    exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    
    -- --this set is : Show Plan Statistics
    -- set @EventId = 98
    -- exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    -- exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    -- exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    -- exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    -- 
    -- --this set is : Show Plan Text
    -- set @EventId = 96
    -- exec sp_trace_setevent @TraceId,@EventId,2,@On--BinaryData
    -- exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    -- exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    -- exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    
    --SECTION STORED PROCEDURES
    --this set is SP: Recompile
    set @EventId = 37
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,29,@On--NestLevel
    exec sp_trace_setevent @TraceId,@EventId,22,@On--ObjectID
    exec sp_trace_setevent @TraceId,@EventId,34,@On--ObjectName
    exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    --this set is SP: RPC:Completed
    set @EventId = 10
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,13,@On--duration
    exec sp_trace_setevent @TraceId,@EventId,18,@On--cpu
    exec sp_trace_setevent @TraceId,@EventId,15,@On--EndTime
    exec sp_trace_setevent @TraceId,@EventId,16,@On--Reads
    exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    exec sp_trace_setevent @TraceId,@EventId,17,@On--Writes
    
    --SECTION TRANSACTIONS
    --this set is : SQL Transaction
    -- set @EventId = 50
    -- exec sp_trace_setevent @TraceId,@EventId,13,@On--duration
    -- exec sp_trace_setevent @TraceId,@EventId,15,@On--EndTime
    -- exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    -- exec sp_trace_setevent @TraceId,@EventId,21,@On--EventSubClass
    -- exec sp_trace_setevent @TraceId,@EventId,34,@On--ObjectName
    -- exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    -- exec sp_trace_setevent @TraceId,@EventId,4,@On--TRansactionID
    
    --SECTION TSQL
    
    --this set is : SQL BatchCompleted
    set @EventId = 12
    exec sp_trace_setevent @TraceId,@EventId,18,@On--cpu
    exec sp_trace_setevent @TraceId,@EventId,13,@On--duration
    exec sp_trace_setevent @TraceId,@EventId,15,@On--EndTime
    exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    exec sp_trace_setevent @TraceId,@EventId,16,@On--Reads
    exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    exec sp_trace_setevent @TraceId,@EventId,17,@On--Writes
    
    -- --this set is : SQL: StmtCompleted
    -- set @EventId = 41
    -- exec sp_trace_setevent @TraceId,@EventId,18,@On--cpu
    -- exec sp_trace_setevent @TraceId,@EventId,13,@On--duration
    -- exec sp_trace_setevent @TraceId,@EventId,15,@On--EndTime
    -- exec sp_trace_setevent @TraceId,@EventId,27,@On--EventClass
    -- exec sp_trace_setevent @TraceId,@EventId,25,@On--IntegerData
    -- exec sp_trace_setevent @TraceId,@EventId,29,@On--NestLevel
    -- exec sp_trace_setevent @TraceId,@EventId,22,@On--ObjectID
    -- exec sp_trace_setevent @TraceId,@EventId,16,@On--Reads
    -- exec sp_trace_setevent @TraceId,@EventId,1,@On--TextData
    -- exec sp_trace_setevent @TraceId,@EventId,17,@On--Writes
    
    exec sp_trace_setstatus @TraceId,1
    select @ReturnCode=@@Error
    if @ReturnCode <> 0
    Begin
    if @ReturnCode = 13
    Print 'ERROR 13 - Out of memory. Returned when there is not enough memory to perform the specified action.'
    else
    if @ReturnCode = 9
    Print 'ERROR 9 - The specified Trace Handle is not valid.'
    else
    if @ReturnCode = 8
    print 'ERROR 8 - The specified Status is not valid.'
    else
    Print 'ERROR 1 - Unknown Error'
    GoTo ErrorHandler
    end
    
    exec sp_trace_setfilter @TraceId,@ColumnId,@LogicalOperator,@ComparisonOperator,@Value
    select @ReturnCode=@@Error
    Print 'Filter 1 set'
     if @ReturnCode <> 0
     Begin
     if @ReturnCode = 1
    print 'ERROR 1 - Unknown error.'
    else
    if @ReturnCode = 2
    Print 'ERROR 2 - The trace is currently running. Changing the trace at this time will result in an error.'
    else
    if @ReturnCode = 4
    Print 'ERROR 4 - The specified Column is not valid.'
    else
    if @ReturnCode = 5
    print 'ERROR 5 - The specified Column is not allowed for filtering.'
    else
    if @ReturnCode = 6
    print 'ERROR 6 - The specified Comparison Operator is not valid. '
    else
    if @ReturnCode = 7
    print 'ERROR 7 - The specified Logical Operator is not valid.'
    else
    if @ReturnCode = 9
    print 'ERROR 9 - The specified Trace Handle is not valid.'
    else
    if @ReturnCode = 13
    print 'ERROR 13 - Out of memory. Returned when there is not enough memory to perform the specified action.'
    else
    if @ReturnCode = 16
    print 'ERROR 16 - The function is not valid for this trace.'
    else
    Print 'ERROR x - Unknown Error'
    GoTo ErrorHandler
    end
    SELECT * FROM ::fn_trace_getfilterinfo(@TraceID)
    set @columnId = 13 --Duration
    set @ComparisonOperator = 4 --Greater than or equal to
    exec sp_trace_setfilter @TraceId,@ColumnId,@LogicalOperator,@ComparisonOperator,@DurationFilterValue
    select @ReturnCode=@@Error
    Print 'Trace Filter 2 set'
    if @ReturnCode <> 0
    Begin
    if @ReturnCode = 1
    print 'ERROR 1 - Unknown error.'
    else
    if @ReturnCode = 2
    Print 'ERROR 2 - The trace is currently running. Changing the trace at this time will result in an error.'
    else
    if @ReturnCode = 4
    Print 'ERROR 4 - The specified Column is not valid.'
    else
    if @ReturnCode = 5
    print 'ERROR 5 - The specified Column is not allowed for filtering.'
    else
    if @ReturnCode = 6
    print 'ERROR 6 - The specified Comparison Operator is not valid. '
    else
    if @ReturnCode = 7
    print 'ERROR 7 - The specified Logical Operator is not valid.'
    else
    if @ReturnCode = 9
    print 'ERROR 9 - The specified Trace Handle is not valid.'
    else
    if @ReturnCode = 13
    print 'ERROR 13 - Out of memory. Returned when there is not enough memory to perform the specified action.'
    else
    if @ReturnCode = 16
    print 'ERROR 16 - The function is not valid for this trace.'
    else
    Print 'ERROR x - Unknown Error'
    GoTo ErrorHandler
    end
    SELECT * FROM ::fn_trace_getfilterinfo(@TraceID)
    -- declare @intfilter int
    -- declare @bigintfilter bigint
    -- 
    -- exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Profiler'
    -- set @bigintfilter = 1000
    -- exec sp_trace_setfilter @TraceID, 13, 0, 4, @bigintfilter
    -- 
    -- set @intfilter = 100
    -- exec sp_trace_setfilter @TraceID, 22, 0, 4, @intfilter
    
    ErrorHandler:
    Return @ReturnCode

    **********end code*************

    I invoke the SP with the following code:

     

    **********start code*************

    DECLARE @FileName   NVARCHAR(128)

    DECLARE @RunStopTime   DATETIME

    DECLARE @MaxSize  BIGINT

    DECLARE @DurationFilter  BIGINT

    DECLARE @TraceID  INTEGER

    DECLARE @MinutesToRun  INTEGER

    DECLARE @rc   INTEGER

    DECLARE @DBID    INTEGER

    DECLARE @DBNAME   NVARCHAR(128)

    -- Set Error Variables

    SET @DBNAME = DB_NAME()

    SET @DBID = DB_ID()

    SET @rc = 0

    --Set Control Variables

    set @MinutesToRun = 2 -- this is how long the trace will run for

    set @MaxSize = 100 -- this is the maximum size for a file, in MB

    set @DurationFilter = 1000

    --Set Running Variables

    --the time the trace will stop

    set @RunStopTime = dateadd(mi,@MinutesToRun,getdate())

    --the file to be create - full name (not UNC)

    set @FileName = 'C:\Auto_Prof\AutoProf_SP_'

      +cast(datepart(yyyy,getdate()) as char(4))  --Years

      +right(cast(datepart(m ,getdate())+100 as char(3)),2) --Months

      +right(cast(datepart(d,getdate()) +100 as char(3)),2)+'_'  --Days

      +right(cast(datepart(hh,getdate())+100 as char(3)),2) --Hours

      +right(cast(datepart(mi,getdate())+100 as char(3)),2) --Minutes

    --Display variables

    print 'File created is : '+@FileName

    print 'End time will be : '+cast(@RunStopTime as varchar(20))

    --Create trace, writing out to tracefile, until endtime

    exec @rc=Up_Auto_Profiler_Perf @FileName,@RunStopTime,@MaxSize,@DurationFilter,@TraceID output

    --Error Handling

    select @rc

    select @TraceID

    -- SELECT * FROM ::fn_trace_getfilterinfo(1)

    -- SELECT * FROM ::fn_trace_getfilterinfo(default)

    SELECT * FROM ::fn_trace_getfilterinfo(@TraceID)

    -- select * from ::fn_trace_getinfo(1)

    -- select * from ::fn_trace_getinfo(default)

    select * from ::fn_trace_getinfo(@TraceID)

    if (@rc <> 0 )

     RAISERROR ('Create/Run of Trace FAILED', 16, 1, @DBID, @DBNAME)

    GO

    **********end code*************

    I've played around with the profiler front end, and checked to see the diffence between the way that they create the trace, and the way that I did - the commented out code with the declare's etc. at the end of the SP was taken straight out of the scripting of a profiler trace.

    I've tried to apply the values as constants, rather than variables, although that largely defeats the idea of having this stored procedure receiving a duration filter.

    To no avail. I get NO message back saying that the execution of the SP_TRACE_SETFILTER failed, RC is 0, yet the filter is not found via the ::fn_trace_getfilterinfo ... while a ::fn_trace_getinfo with the same @traceid variable successfully returns the correct info, proving that the trace was reated, and that the traceid value is correct (and the fn_trace_getinfo is done after the _getfilterinfo) so there is no "resetting of @traceid" that could cause it to get 0 rows.

    It plainly looks like the sp_trace_setfilter executes but does nothing!

    So far Technet Forums, MS searches, Google searches, have been unfruitful.

    Help!!

  • Found it!!!

    *sigh* - a blonde moment!

    Just before I add the filters, I exec:

    exec sp_trace_setstatus @TraceId,1

    In other words, I start the trace, hence I cannot apply filters. And because I am checing @@error for the exec sp_trace_setfilter, and not doing what I SHOULD be doing, which is:

    exec @ReturnCode=sp_trace_setfilter ...

    I never received the response saying that the filter was running (error 2).

Viewing 2 posts - 1 through 1 (of 1 total)

You must be logged in to reply to this topic. Login to reply