A new Version of AseTune is Available.
Even if AseTune tells you've got the latest version, there is a new one.
Download it at https://dbxtune.com/#download
or at: http://sourceforge.net/projects/asetune/files/

# History of what has been done so far

## YYYY-MM-DD

### Generic - MAJOR Changes That affects all DbxTune tools

- xxx

### Generic - Changes that affects all DbxTune tools

- OsMemory -- Swapping -- Changed 'Moving Avergae' from 10 minutes to 15 minutes
- OsMemory -- For alarms 'Swapping' and 'SwapThrashing' also send info on current Memory Usage
- CmOsDiskSpace -- Added new graph: FsSizeMb -- mainly used for: DbxCentral Space Prediction Report
- CmOsPs -- Preparing for "switching from 'ps' to 'dbxtune_get_process_stats.py'", this to get better Process CPU/other statistics by using '/proc/*' files on Linux
- CmOsXxx -- All the OS Monitoring GUI Panels now also shows what user we connected as.
- CmOsDiskSpace -- Skipping some more file-systems. And also if the size is below 500 MB it's skipped. can be changed with property `hostmon.MonitorDiskSpace.skip.sizeMb.lt = ###`
- CmOsPs(Windows) -- Added columns '%Cpu' & '%CpuAdj' to calculate how much Percent of the host we are using '%Cpu' Can be above 100%. '%CpuAdj' is %Cpu/numOfCores
- Fixed some small bugs in create AppDir, and changed what files to copy (especilyy for windows)
- PCS: Stripped of unnecessary part of the servername (like domain name and port numbers, so we dont have to use -A flag in most cases
- For "all" alarms, there is now a new section "Alarm Options": With information about how to change the alarm properties
- Alarm Handler now saves all the Alarms between restarts in NO-GUI (no new Alarms just due to a collector restart) file: $(HOME)/.dbxtune/dbxc/conf/servers/${servername}.AlarmHandler.jso
- Configuration for NO-GUI new Writable Config file (enables change and persist config changes at server level from Web UI) file: $(HOME)/.dbxtune/dbxc/conf/servers/${servername}.save.conf
  (Search order is: NOGUI_SAVE (server level cfg file), PCS (shared NO-GUI cfg file), USER_CONF, SYSTEM_CONF)
- Alarms: Added ability to change the Severity of Alarms using property: AlarmClassName.severity = {INFO|WARNING|ERROR}
  This can help if you still want an alarm to be produced. But the Alarm Writer (to mail) can be configued to not send INFO messages.
- Added command line parameter -w|cfgWizard. To open GUI in Create NO-GUI Configuration Wizard
- NO-GUI: Added config option 'CounterSet.template.default=SMALL|MEDIUM|LARGE|ALL' to Config file. Used if a new CM is intruduced/added and we DO NOT have it in the SERVER/GENERIC Config file, we should trust this level
- Changed TemplateLevel() for a bunch of the Counter Models to work with the above 'CounterSet.template.default'
- Configuration: can now read content from a file. (key = file: /path/toFile/theFileName)
- Finding Changes to Config files WatchService (read changed config files and fire on changed key/value): Fixed/Improved
- Menu -- Tools -- 'Create Record Session - Template file' Wizard...' now writes a template file with comments (and all default values are commented out). You can choose to sort the CM Entries by name or have it in creation order!
- PCS Writers now also Writes "Target Info: " in the log file (for tracability)
- AppDir got some improvements for the upcomming Windows: DbxInstaller
- Alarms Handling:
  - New alarm: AlarmEventSpaceFullPrediction -- When we predict that we will fall "short" on space usage
  - Changed: SrvDown -- Only the "base" url will be passed
  - Changed: DbmsVersionString -- Changed from INFO to WARNING
- Daily Summary Report Changes
  - Added timeout of 15 minutes for SQL Queries in the Reports
  - If links in the DSR pints to "strange" URL's you can override the with properties `DbxCentral.internal.base.url`, `DbxCentral.public.base.url`
  - Getting JS/CSS files: First: get from local server, as a fallback use CDN's (this so we can read the DSR from "anywhere")
  - In section 'Recording Info', added fields for: 'Sample Period in Seconds', 'Config File', 'Log File'.
  - In section 'Recording Info', added fields for: 'Counter Information', 'Counter Config' -- A collapable: To view what collectors are recorded and how they are configured.
  - If any Report Sections times-out when running SQL Statements, include a "explain", so we can get the execution plan... to fix the issue...
  - In OsSpaceUsageOverview; show Estimate of "how many days until Disk is full" -- Raise Alarm if "CRITICAL" -- Meaning: in 7 days we will get full
  - Sending AlarmEventDbmsVersionString in Daily Summary Report if version string has changed
- Upgraded some of the third party libraries/jars
  - To version 2.27.7 Component: Jsch
  - To version 5.4-SNAPSHOT Component: JSqlParser-
  - To version 3.7.1 Component: jquery
  - To version 1.14.1 Component: jquery UI
  - To version 4.6.2 Component: Bootstrap
  - To version 1.30.0 Component: Prism
  - To version 2.7.3 Component: ChartJS

### DbxCentral - The central WEB console to view Trend Graphs

- Tried SSL setup but filed with Jetty 9.4 (Jetty 11, which requires Java 11 will be tested OR Jetty 12.1, which requires Java 17)
- Added LetsEncryptAcmeChallengeServlet to handle LetsEncript acme challenge requests.
- PcsJdbcCleaner for DbxcLocalMetrics using a fallback method if getMetaData().getColumns() does not find any records.
- Create a Daily Summary Report on older H2 db versions. Now gives a proper error message.
- Create a Daily Summary Report on existing H2 database: Made the dialog slightly better ('Save File', or 'Open in New Tab')
- Switch for getting JS/CSS files from various CDN to have them locally on the server. So we can work on closed networks (no access to Internet)
- Added SSL support for the HTTP Server (but it probably needs a better implementation, using a newer version of Jetty (but then I'll have to upgrade to Java 17)
- Skipping alarms if the collectors havn't sent any data for a while AND the server is NOT in the SERVER_LIST file.
  This can be disabled with property `ReceiverAlarmCheck.skip.servers.not.in.SERVER_LIST={true|false}`
- In log file tail mode, press enter, will add a "marker", so it's easier to see when new lines has arrived.
- In the 'Servers' section. Added 'User Defined Action': So we can add "self service" SQL/OS Commands. Like execute commands that normally needs a higher authorization than a normal SQL/OS login.
- For 'User Defined Actions', I also added the ability to send mail, when it has been executed (including the output of the Action). So if you want to get notified when "anyone" has executed the User Defined Action, you are covered.
- In the 'Servers' all sections are now "collapsible" by clicking on the section header.
- New context menu item at the server button "Space Forecast Report" -- Creates a Forecast of space used for: OS (Data and WAL)
- New context menu item at the server button "Select Graphs to View..." -- Opens a modal dialog so you can choose what Graphs you want to see.
- After start, Local alarms (like CPU/Swapping etc, are disabled for 10 minutes; so that after a restart it can normalize without sending false alarms)
- Added user self-service: user-registration, login-modal, password-recovery, account-settings(change password)...
  Most of this things was done: to get 'User Defined Actions' to work in a better way.
- The Web UI got a bunch of new functionality
  - Active Statements: No changes, just a bit smaller font, to align with the below dialogs
  - CM Detail Dialog:
    - Show Abs/Diff/Rate Counters for any of the Collectors.
    - In the Dialog: There is a "tabbed" panel system that is similar to the Native GUI Tool
    Records are fetched from the DbxTune Collectors detailed database recording.
    Not as much functionality as in the Native GUI, but it's a start!
    - Some CM's have Local Graphs, based on content in the data table (just like the Native GUI)
    - Context Menu on CmName: with Properties, to view: SQL Statement, Options, Local Settings, Alarms, etc...
  - Alarms Dialog: A new hopefully better Alarm Dialog is in both index.html and in graph.html
    - Now you can also "mute" Alarms (for X hours)
    - In graph.html, when in history mode... If alarms were present at a specififc time in the timeline, they will show up
  - DBMS Config Dialog: Just like in the Native GUI, you can look at the latest stored DBMS Configurations
- Login modal now appears in-place on any page - no more redirecting to index.html to log in and back
- /log and /conf pages now have the full navbar and consistent styling
- At the Graph Page - Right click 'Select Graphs...' open the "Select Graphs to View..." modal so you can add/remove/re-order graphs you want to view
- You can now use 'Microsoft Entra ID' or 'Google' (OAuth) to login to DbxCentral -- For example see: /DbxTune/resources/dbxcentral/scripts/conf/DBX_CENTRAL.conf
- in graph.html: In the Navbar, added "Tools" dropdown menu
- for SQL Server: In the context menu at index.html added "Showplan Loader"
- for SQL Server: Added "Query Store" button at the top right
- for SQL Server: Showplan View, got some brushup, like: Plan Analyze section, the various seconds are now foldable
- Implemented MCP for LLM integration. See file README_MCP.md for how to enable and use it
- Configure Alarms for Collectors from the Web UI: This can now be done... Still some issues.
- Landing page: if we only have Muted alarms: The colour of the button will be "muted red" or raspberry red
- Counter Details: If postpone is enabled: Then show latest available data, AND: Show a yellow label that the next sample will happen in MM:SS
- Muted Alarms: bugfix, now restored properly after a restart.
- Dialog size: Active Statements, Counter Details, DBMS Configuration, Query Store
  Instead of using absolute size in pixels... Calculate what percentage of the screen it's using
  On page reload: If the dialog was active previously open it again (do not wait for new data to arrive)
- Dialog: Active Statements
  Rezisable at any of the edges, added icon, tooltip from CmActiveStatements
- Dialog: Counter Details, DBMS Configuration
  Mark the current selected tab with a blue "ribbon" at the bottom of the tab (easier to spot what is currently selected)
- Dialog: Counter Details If Postpone is enabled, and we are in history mode: Show prev/next buttons with the prev/next time that has data
- Dialog: Query Store List what databases are enabled/disabled (in a collapsable panel), Also a "Copy SQL" so we can eisier enable Query Store for that database.
- Added option for higher security (or who can see data):
  - Option `DbxTuneCentral.login.mandatory=true|false` Default=false
  `false`: Anyone can see Server status, Alarms and Metrics on any server (just like it is "today)
  `true` : Only logged in users can see: "anything"
- Account management
  - Users can create accounts or request access; admins approve/reject from the User Administration page
  - Account Settings (name, email, password with strength indicator) available from the navbar on all pages
  - Tracks last login date and failed login count per user
- Landing page: Server Groups can now be collapsed (when collapsed: Badges are showing the underlying server states: # Servers, # OK, # Alarm, # Muted)
- Admin Page: Add Collector: Refresh/Restart buttons
- Admin Page: Improve user table in admin UI (Last Login, Login Count, Login Fail Count columns)
- Tried to fix "missing Counder Data"... If the PCS is slow at storing data... we might "not see it" at DbxCentral -- So Basically retry fetch data (BUT I could NOT test this, so it might still be broken)
- Counter Details -- Remember current tab name within a "tab group" (move more fluently between tabs, and remember the last visited CM)

### AseTune - Sybase/SAP Adaptive Server Enterprise

- ASE 16.1 'sp_spaceused tabname' does now report sizes in MB instead of KB... So adjustments for that was needed
- PCS - Statement Normalizer JSQLParser was upgraded to use version 5.3
- Tool: Statement Cache Bloat Detector -- some changes to minimize 'Faulty SQL Syntax'
- Backup History (from table: master.dbo.sysdumphist) is captured in no-gui config on Database rollover
  It can be configured with: `AseTune.onPcsDatabaseRollover.captureBackupHistory={true|false}`, and `AseTune.onPcsDatabaseRollover.captureBackupHistory.daysToCopy=##`, where default is 14 days
- In SqlCaptureBrokerAse: added 'RewrittenSqlText', 'ParseEx1', 'ParseEx2' to troble shoot why/what SQL Statements is not handled by the JSqlParser, so we can write "normalizers" for them.
- CmCachePools -- Added Graph 'Cache Pools Physical Writes'
- CmErrorLog -- If no threshold procedure was installed... And we reach LCT (Last Chance Threshold)... Which means that we are VERY CLOSE to a FULL WAL (Write Ahead Log): raise AlarmEventFullTranLog
- CmOpenDatabases -- Alarm: LastBackupFailed was made to raise 'LastDbBackupFailed' or 'LastWalBackupFailed'.
- CmOpenDatabases -- Added new graphs: DbLogSizeMbGraph & DbDataSizeMbGraph -- mainly used for: DbxCentral Space Prediction Report
- CmOpenDatabases -- changed default for 'alarm.system.if.LastDbBackupAgeInHours.skip.dbs=(model|tempdb)' and 'alarm.system.if.LastLogBackupAgeInHours.skip.dbs=(master|model|tempdb)'
- CmPCacheModuleUsage -- Alarm: StatementCacheAboveConfig -- Refresh Statement Cache size before sending alarm.
- CmStatementCache -- Added new graphs: RecompilReason to show why it was recompile
- CmSummary -- Added new graphs: Deadlock Count
- CmSysWaits -- Added new graphs: sysWaitLockTime, sysWaitLockCount & sysWaitLockTpw -- To view Server 'Waiting to Take a Lock', by WaitTime/WaitCount/WaitTimePerCount
- Daily Summary Report
  - Report Info -- Added fields for 'ASE Max Memory', 'ASE Memory Available'
  - Show Configuration -- Now also includes 'ASE Cache Configuration'
  - Usage Overview -- Added some graphs: CmCachePools_PoolUsedMb, CmCachePools_PoolUtil, CmCachePools_PoolHitRate, CmCachePools_PoolReplaceSlide, CmCachePools_PoolPhysicalWrites
  - Error Info -- Added Description for the Error number on each collapsable error number
  - Statement Cache Overview -- Added some graphs: CmSpMonitorConfig_ProcCacheMemUsage, CmPCacheModuleUsage_GraphMb
  - Statement Cache Details -- Added 'scan-rows', 'qual-r-rows', 'qual-w-rows'
  - AseTopTableSize -- New Section
  - OsSpaceUsageOverview -- New Section
  - AseBackupHistory -- New Section
  - Usage Overview -- Added graph: CmSummary_OldestTranInSecGraph, CmSummary_DeadlockCount, CmSummary_BlockingLocksGraph, CmSysWaits_sysWaitLockTime, CmSysWaits_sysWaitLockCount, CmSysWaits_sysWaitLockTpw
  - AseDbSize -- show Estimate of "how many days until Data/WAL is full" -- Raise Alarm if "CRITICAL" -- Meaning: in 7 days we will get full
  - AseStatementCacheUsageOverview -- Show graph on CmStatementCache_RecompilReason
  - AseTopCmStmntCacheDetails -- show "AvgScanRows", "AvgQualifyingReadRows", "AvgQualifyingWriteRows" -- To see if we are scanning more rows than "needed"

### IqTune - Sybase/SAP IQ (The Column Storage Database)

- No changes, please request some if you want this tool to evolve

### RsTune - Sybase/SAP Replication Server

- Added graph -- SQT: Number of Commands in First Tran (col 'First Trans', 'st:C,cmds:###') -- So we can see how many command that are in "closing" mode at the DSI Thread
- Daily Summary Report -- Added section for: SQM, SQT and DSI details

### RaxTune - Sybase/SAP Replication Agent X

- No changes, please request some if you want this tool to evolve

### HanaTune - SAP HANA

- No changes, please request some if you want this tool to evolve

### OracleTune - Oracle Database

- Added 'CmActiveStatements' -- NOT READY to release to public yet... A lot more is needed here (for now it's only added if the host name is 'gorans3')
- DBMS Configuration -- Has a small bug, which meant it couldn't be saved to the PCS
- Get active Roles using: SELECT * FROM SESSION_ROLES
- When storing values in PCS, Data Type "raw" (JDBC: Types.BINARY or Types.VARBINARY) the precision was at 0. Now using getColumnDisplaySize() or hard-code to 32 if DisplaySize was not available

### SqlServerTune - Microsoft SQL-Server

- ObjectId Cache -- Handle more Error Codes (Skipped when databases are not recovered, offline, etc...)
- Backup History (from table: msdb.dbo.backupset) is captured in no-gui config on Database rollover
  It can be configured with: `SqlServerTune.onPcsDatabaseRollover.captureBackupHistory={true|false}`, and `SqlServerTune.onPcsDatabaseRollover.captureBackupHistory.daysToCopy=##`, where default is 14 days
- Removed the "lock timeout" at the connection level, Still keeping it at "places" where we want lock timeout... instead of Statement Timeout)
- Query Store Dialog, in Web UI: A bunch of improvements
- Added default values for new sp_configure defaults for SQL Server 2025
- Windows HostMonitoring via 'typeperf': added -sc ####. Which makes it to die after 36 hours. (this to save guard that we dont have to many 'typeperf' processes running after a collector restart)
- New collector: CmJobScheduler -- What SQL Agent Job Scheduler are running now and what has been running. Alarms: RUNNING_LONG, MISSED, FAILED_LAST_RUN
- Query Store Extractor: first try execute '${dbname}.dbo.dbxtune_flush_query_store', if it do not exists fallback on '${dbname}.dbo.sp_query_store_flush_db'
- DbmsConfigIssue -- Fix SQL Server on Linux memory detection (SQLPAL only reports 80% of physical memory)
- Job Scheduler Extractor -- Add user-defined job message formatter profiles via properties file
- CmActiveStatements -- Cleaned up SQL Statements for 'lastKnownSql' that starts with ')' and simply removed that.
- CmActiveStatements -- Added columns: exec_row_count, sess_row_count -- To view rows delivered to client.
- CmActiveStatements -- Added new columns: rt_at_root_node, rt_node_id, rt_node_operator, rt_est_pct, rt_est_row_count, rt_row_count_abs, rt_row_count, HasRtOperators, RtOperators
  The columns are fetched from table 'sys.dm_exec_query_profiles' if option 'CmActiveStatements.sample.stmntRunTimeOpInfo' is enabled.
  This will make and "estimated" guess how far this Statement has processed. Note: This may be way off...
- CmActiveStatements -- Added option to distinguish between 'User' and 'Internal' TempdbUsageMb
- CmDatabases -- Cleaned up SQL Statements for 'most_recent_sql_text' that starts with ')' and simply removed that.
- CmDatabases -- Added new graphs: DbLogSizeMbGraph & DbDataSizeMbGraph -- mainly used for: DbxCentral Space Prediction Report
- CmDatabases -- Only get "Database Scoped Configuration (Only Non Defaults)" for databases with higher compatibility_level than 130 (or higher)
- CmDatabases -- changed default for 'alarm.system.if.LastDbBackupAgeInHours.skip.dbs=(model|tempdb)' and 'alarm.system.if.LastIncDbBackupAgeInHours.skip.dbs=(model|tempdb)' and 'alarm.system.if.LastLogBackupAgeInHours.skip.dbs=(master|msdb|model|tempdb)'
- CmIndexOpStatSum -- Added graph: Insert/Update/Delete Rows Per Second for User Databases
- CmMemoryClerks -- In graph "All Memory Clerks vs Target & Total Memory, in MB" -- added one line "All Other Memory Clerks" -- So we can see "memory steals" easier
- CmSchedulers -- Added diff calculations for some columns: "total_signal_time", "total_waits_completed", "total_enqueued_tasks", "total_completed_tasks", "spinlock_wait_time_ms", "spinlock_wait_count"
- CmSummary -- In alarm 'LockWaits' -- Added "Server LCK_M_* Wait -- Lock Information", so we easier can see what type of blocks we had
- CmWaitStats -- Added new graphs: LockTime, LockCount & LockTpw -- To view "Server LCK_M_* Wait Types, by 'wait_time_ms/waiting_tasks_count/WaitTimePerCount'.
- CmWaitStats -- In the skip list added wait_types: 'AZURE_IMDS_VERSIONS', 'PREEMPTIVE_OS_DELETESECURITYCONTEXT', 'PREEMPTIVE_OS_REPORTEVENT', 'POPULATE_LOCK_ORDINALS', 'SOS_WORKER_MIGRATION' from Glenn Berry: SQL-Server-2025-Diagnostic-Information-Queries.sql
- CmWaitingTasks -- Cleaned up SQL Statements for 'currentSqlText' that starts with ')' and simply removed that.
- Daily Summary Report
  - Usage Overview -- Added Graph: CmIndexOpStatSum_OpIudUserDbs
  - Database Operational Summary -- Added Graph: CmIndexOpStatSum_OpIudUserDbs
  - SqlServerBackupHistory -- New section
  - Usage Overview -- Added Graph: CmSummary_OldestTranInSecGraph, CmSummary_DeadlockCountSum, CmSummary_BlockingLocksGraph, CmWaitStats_LockCount, CmWaitStats_LockTime, CmWaitStats_LockTpw
  - SqlServerDbSize -- show Estimate of "how many days until Data/WAL is full" -- No Alarms is raised, instead we trust OsSpaceUsageOverview to do that for us (if autogrow is not enabled, you may want to enable alarms on this with `SqlServerDbSize.alarm.DaysToFull.enable=true`)
  - SqlServerTopCmExecQueryStatPerDb -- added column 'total_waisted_grant_kb__sum' & 'AvgWaistedGrantKb'
  - SqlServerTopCmExecQueryStat -- added column 'total_waisted_grant_kb__sum' & 'AvgWaistedGrantKb'
  - SqlServerTopCmExecQueryStatDb -- added column 'total_waisted_grant_kb__sum' & 'AvgWaistedGrantKb'
  - Query Store -- Fixed some calculation bug (previously it calculated to high values from Elapsed and CPU Time etc...)
  - SqlServerJobScheduler -- Added column 'scheduledLast24hChart', which is a "gantt" that tries to visualize when a job was executed during the day.

### PostgresTune - PostgreSQL

- CmTableBloat -- New CM to estimate table bloats from statistics
- CmPgTables -- Added column 'est_bloat_pct' -- algo: n_dead_tup / n_live_tup * 100 (Skipping tables with 'n_dead_tup' less than 100)
- CmPgTables -- Added column 'reloptions' -- So we for example can see table specififc autovacuum settings
- CmPgTableSize -- Added column 'reloptions' -- So we for example can see table specififc autovacuum settings
- Daily Summary Report
  - PostgresLongRunningStmnts -- Added Graph: CmPgDatabase_Deadlocks

### MySqlTune - MySQL database

- No changes, please request some if you want this tool to evolve

### Db2Tune - IBM DB2 LWU

- No changes, please request some if you want this tool to evolve

### SQL Window

- Changed the Filter field to work with JSQLParser version 5.3 (NOTE: There is still some problems and/or statements that are after IN(...)
- Better handling of datatype translation for '| bcp' and 'ResultSetInformation'. Postgres:varchar > 65535 is translated to TEXT, SqlServer: source nvarchar/varchar MAX is translated to CLOB.
- ASE/SQLServer/Postgres: Added some static Code Completions
- In the editors context menu: Added 'Show Indent Guidelines'
- Added "template" pre processing using FreeMarker. Meaning we can do loops and other simple control, for example

      <#list ["2026-04-21", "2026-04-20", "2026-04-19", "2026-04-18", "2026-04-17", "2026-04-16", "2026-04-15", "2026-04-14", "2026-04-13", "2026-04-12"] as dbdate>
      \rsql -Usa -P null -u jdbc:h2:tcp://dbxtune-vm.maxm.se/PROD_A2_ASE_${dbdate};IFEXISTS=TRUE
      SELECT CURRENT_CATALOG()
      go
      </#list>
      print-template  -- NOte this is just to debug what the template has produced

- On JDBC-cancel, now also print a INFO message that we are dong cancel() on the Statement or Connection

### Log Tail Tool

- No changes, please request some if you want this tool to evolve

## 2025-11-30

### Generic - MAJOR Changes That affects all DbxTune tools

- Now java 11 is needed
- The package name was changed for all classes from 'com.asetune' to 'com.dbxtune'. (so anyone referencing the internals of DbxTune will have to change)
- The above meant that the `asetune.jar` also was changed to `dbxtune.jar`, and also the ZIP package from `asetune_YYYY-MM-DD.zip` to `dbxtune_YYYY-MM-DD.zip`
- Log4J Version 1 was replaced with Log4J Version 2
- Internal stuff... Rewrote a bunch of constructs to be able to move to Java 11, 17 or 21. (Java 11 is needed to upgrade to H2 latest version, which will be done soon)

### Generic - Changes that affects all DbxTune tools

- Added option `-N|--displayName` to all the DbxTune collectors. This will set the Display Name in DbxCentral (button), but the server name will still be the key where "stuff" are stored. (Note: you can also use -A|--serverAlias to name a DBMS instance differently than the server name)
- Alarms "Duration" does now reflect the "Full/Actual Duration" in a better way (for the Alarms with time thresholds... adding the threshold time to the duration makes the "Full/Actual Duration"
  Note: templates that references '`${duration}`' will have a slightly new output '01:10 (MM:SS) -- Added/Adjusted ## Seconds to the Alarm Raise Time'. Also there are new variables '`${alarmDuration}`', '`${fullDuration}`', '`${fullDurationAdjustmentInSec}`' if you want more control.
- From Mail Addresses: You can now add "display name" in the "From" sender. Example: `AlarmWriterToMail.from = some.name@acme.com <The Display Name>`
- AlarmWriterToMail: Some properties was miss spelled, which is now fixed. 'smpt' -> 'smtp' (But I will still read the old names for backward compatibility, if the new names are missing)
- SshConnection: Replacing ganymed-ssh2 lib with Jsch 0.2.7, which was a major rewrite in that subsystem
- Added switches '--localHostMon' if the monitored DBMS is on same host and we don't need/want to open a SSH Connection
- Added switches '--localHostMonWrapperCmd' if the monitored DBMS is remote but we can't use 'Jsch' library to communicate we can execute a local command that relays/forwards the OS Commands vi this command (this can for example be the ssh binary)
- The above two switches also have corresponding fields in the Connection Dialog
- For all collectors, Created a new Writer class PersistWriterToDbxCentral, as a complement to PersistWriterToHttpJson so we can controll it a bit better
- Configuration (Properties), enhancement to USE_DEFAULT value (really an internal thing, but now you can use config value 'USE_DEFAULT' in more places.
- For DBMS Configuration, it's now possible to execute OS Commands (if we have a OsMonConnection)
- DbxCentral - Local Metrics (os monitoring on DbxCentral host), property: `DbxTuneCentral.start.localMetricsCollector=*true*|false`
- DbxCentral - Possibly start the Local PCS Directory Receiver (to not send JSON from any collector to DbxCentral) property: `CentralPcsDirectoryReceiver.storage.dir=${tmpDir}/DbxTune/DbxCentral/file_receiver`
- When sending information to HTTP/DbxCentral -- Turn off 'Meta Data' information by default
- Reset to DEFAULT settings on all GUI Counter Tabs (right click on background pane and choose: Reset all Local Options to defaults, For this or all)
- Open ALARM settings on all GUI Counter Tabs (right click on background pane and choose: Open Alarm Options)
- DBMS Config: In Text Panels, transform Ascii Tables to GUI Tables, using: "select text", right-click and choose "Selected text to JTable"
- Wizard "Create Offline" or "Record Session", write properties with "USE_DEFAULT:xxx" for values that are defaults instead of hard values (which may or may not be default values)
- PersistWriterToHttpJson: Changed send counter for 'CmActiveStatements' to include MetaData for CounterInfo(is diff/rate/pct), but exclude JDBC Datatypes.
- Send mail: the JSON was extended with a "fallback entry", example: [ {"serverName":"srv1", "to":"xxx@acme.com", "alarmName":"(Dummy1|Dummy2|Dummy)"}, {"serverName":"srv2", "to":"yyy@acme.com"}, {"fallback":true, "to":"zzz@acme.com"} ]
- openssl en/de-crypting passwords for RHEL 8 when using algorithm "openssl enc -base64 -aes-256-cbc -pbkdf2 -iter 100000" instead of "openssl enc -aes-128-cbc -a -salt"
- cmd line util to upgrade the ${HOME}/.passwd.enc file from version 1 to v2 (bin/dbxtune.sh dbxPasswordUpgrade)
- cmd line util for dbxPassword. (bin/dbxtune.sh dbxPassword)
- if a ResultSet holds Types.CHAR/NCHAR it's automatically changed to Types.VARCHAR/NVARCHAR, to save space in PCS. (turn this off by override changeJdbcCharIntoVarchar())
- Changed the default storage for Graph/Charts from LABEL_IN_SEPARATE_COLUMN to COLUMN_NAME_IS_LABEL (now using the column name as the "label name" instead of a separate column holding the name)
- PCS: If CountersModel number of columns changes "on the fly", we will now alter the CM PCS tables on the fly (more columns will be added, but not deleted)
- CmOsVmstat: for Linux: Raise Alarm 'AlarmEventOsSwapThrashing' when we have paging/swapping both 'in' AND 'out' at the same time. Both 'in' AND 'out' needs to be above the threshold for 10 minutes.
- CmOsMeminfo: for Windows: Raise Alarm 'AlarmEventOsSwapThrashing' when we have paging/swapping both 'in' AND 'out' at the same time. Both 'in' AND 'out' needs to be above the threshold for 10 minutes.
- CmOsDiskSpace: On Windows add the 'disk label' to the 'drive name' for easier determination of what the disk may be used for
- CmOsIostat: On Windows add the 'disk label' to the 'drive name' for easier determination of what the disk may be used for
- NO-GUI now starts a Management Web Server (localhost:89##), so we can do some management of configuration etc from DbxCentral web ui
  Note: This is still in development...
- Added extra "Graph Properties", so individual graphs can set "sampleType" to other than "AUTO" (for example Disk Space Available can have MIN_OVER_SAMPLES)
- MonitorIoLinux -- In RHEL 9, there are new column in 'iostat'
- NO GUI Mode: -u|--sshUser has an "extended format "userName:userNameToLookup" where 'userNameToLookup' is the key in the ~.passwd.enc file (this so we can have different passwords on a DBMS user and a OS User)
- Configuration File changes (if the underlying file change) now also supports change notifications if the config file is a soft link
- Configuration command line utility to "create" a encrypted property field from cmdline (so we can paste the value into a property file manually)
- Print out CM Refresh time after each collection has been made (this can be disabled by: dbxtune.print.cm.refresh.time = false)
- A Graph on CM Refresh time has also been created
- PCS: DataDirectoryCleaner -- New config to cleanup on Disk PCT Used 'DataDirectoryCleaner.max.historical.space.usage.pct=94.0'
- NoGuiManagementServer -- Added: /reports/sqlserver/job-scheduler-report to view a mini version of DSR for SQL Server Job/Scheduler and CPU Overview
- NoGuiManagementServer -- Added: /reports/sqlserver/job-scheduler-timeline to view SQL Server Job/Scheduler timeline (a timeline chart with job activity)
- CmOsMpstat: If CPU Usage is above 90% for more than 45 minutes, send HighCpuUtilization(INFO) , also send info from CmOsPs on top OS Processes...
- CmOsMpstat: If CPU Usage is above 95% for more than 15 minutes, send HighCpuUtilization(WARNING), also send info from CmOsPs on top OS Processes...
- CmOsMpstat: If CPU Usage is above 99% for more than 15 minutes, send HighCpuUtilization(ERROR) , also send info from CmOsPs on top OS Processes...
- Host Monitoring: "Swapping" "SwapThrashing" is now working on a 10 minute Moving Average (instead of 5 minutes)
- Host Monitoring: MpStat now has INFO/WARNING/ERROR Alarms when CPU Usage is to high
- Fixed some backward compatibility (if config has 'com.asetune.xxx' we automatically changes that to 'com.dbxtune.xxx'
- Changed shutdown functionality a bit (sometimes shutdown did not work as expected)
- On startup: Print environment variables for: DBXTUNE_HOME, DBXTUNE_USER_HOME, DBXTUNE_SAVE_DIR, DBXTUNE_LOG_DIR, DBXTUNE_CONF_DIR, DBXTUNE_INFO_DIR, DBXTUNE_REPORTS_DIR
- On startup: Print environment variables for in no-gui mode: DBXTUNE_CENTRAL_BASE, DBXTUNE_CENTRAL_SAVE_DIR, DBXTUNE_CENTRAL_LOG_DIR, DBXTUNE_CENTRAL_CONF_DIR, DBXTUNE_CENTRAL_INFO_DIR, DBXTUNE_CENTRAL_REPORTS_DIR
- Connection Dialog to Sybase, added checkbox to NOT lookup host/port to a profile name (which makes it easier to change host or port for an existing profile)
- All collectors now have a shutdown URL '/mgt/shutdown' (this is used from the Windows Service to shutdown a collector)
- Daily Summary Report -- Table details (like available indexes etc) are now collapsed by default. can be changed with property 'DailySummaryReport.TableInfo.details.open=true|false' (default=false)
- DataDirectoryCleaner -- Sort on DATE so we remove file in DATE order. And do NOT allow to delete TODAYS recording
- Do not start DbxCentral or Collectors if we are starting with a H2 Database of the "wrong" version (also print how to migrate older H2 databases)
- CheckForUpdates -- If the backend is overloaded, try later...
- GUI -- In the Connection Dialog added option 'On Connect, Get DBMS Configuration', so we can disable this if we want to connect to a DBMS that is heavily loaded
- Alarms Handling:
  - Added 'alarmId' so we can identify alarms, and in the future also "aknowledge" alarms (for alarms we dont want to see)
  - In the Mail and Slack Template added a "link" so we can open DbxCentral (in history mode) and view trends/SQL when the alarm was active... varialble: ${dbxCentralUrl}
  - New: AlarmEventOsSwapThrashing -- When we are swapping both in and out at the same time... Linux(vmstat, column 'pi' and 'po'), Windows(column 'Pages Input/sec' AND 'Pages Output/sec')
  - New: AlarmEventDbmsVersionString -- If the version string changes during collection, then make a short Information Alarm about this.
  - Changed: AlarmEventOsSwapping -- From Severity 'WARNING' to 'INFO'
  - Changed: AlarmEventConfigChanges -- small change to include log timestamp in alarm message
  - Changed: AlarmEventConfigResourceIsUsedUp -- small change to include log timestamp in alarm message
  - Changed: AlarmEventErrorLogEntry -- small change to include log timestamp in alarm message
  - Changed: AlarmEventFullTranLog -- small change to include log timestamp in alarm message
  - Changed: AlarmEventProcessInfected -- small change to include log timestamp in alarm message
  - Changed: AlarmEventProcessStackTrace -- small change to include log timestamp in alarm message
  - Changed: AlarmEventProcessTimeSliceError -- small change to include log timestamp in alarm message
  - Changed: AlarmEventBackgroundMessage -- small change to include log timestamp in alarm message
  - Bugfix: xxx
- Daily Summary Report Changes
  - In the 'Recording info', Print the 'Display Name' if any...
  - many Line Chart is "sorted", so the series that holds the most values (sum of all data point) are presented/printed first (a text will indicate if it's sorted or not)
  - Added 'CmOsNwInfoOverview' for all collectors
  - Alarms, details are now also available in short report (Mail Receivers)
  - Some Graphs are now sorted (series with high overall values are first). If it's sorted a "info note" will say no.
  - OsIoStatOverview on some platforms it didn't work good (for column 'await' depending on what iostat version we were using)
  - In the Recording Information section Write what Java version we used.
  - Introduced a "priority queue", so that not to many DbxTune collectors does DSR at the same time, which causes extensive CPU usage and possibly memory issues
  - When generating SparcLines, introduced a timeout of 10 minutes... and prints SQL for easier debugging.
  - In the 'Exec/Creation time for each Report Section' also print aprox how many bytes we have written to each section
  - In the header added "OS Core Count" and "OS Physical Memory" information.
  - Under "recording info" I'll try to print out (in red) if the DBMS Version String has changed during that day
  - Added section 'Counter Models Refresh Info' so we can see what CM's that are taking a long time to refresh (and therefor are interesting to look at... or rewrite/enhance)
  - Only print "table information" about tables in current database. Config: DailySummaryReport.top.statements.onlyListObjectsInCurrentDatabase={*true*|false}. NOTE: There are room for improvements here (a better parsing of the query should be done to look if the object are lokal or not... I'll revisit that at a later stage)
  - ReportSenderToMail -- On failures "Exception: 552 5.3.4 Error:" or "message file too big", now tries to "recreate" the message with a *smaller* content and send again. FULL -> SMALL -> OnlyAttchemnt -> Minimal
  - Implementing 'minimal' output, used as a fallback in case "previous" output was to large (ex: for mail if the send failed, due to "to large")
- Upgraded some of the third party libraries/jars
  - To version 2.4.240 Component: H2 Database
  - To version 9.4.58 Component: Jetty Webserver
  - To version 13.2.0 Component: MS SQL Server JDBC Driver
  - To version 9.4.0 Component: MySQL JDBC Driver
  - To version 42.7.8 Component: Postgres JDBC Driver
  - To version 1.17.1 Component: commons-codec
  - To version 1.6.0 Component: commons-email
  - To version 2.17.0 Component: commons-io
  - To version 1.12.0 Component: commons-text
  - To version 1.6.7 Component: jakarta.mail
  - To version 2.0.1 Component: jakarta.activation
  - To version 3.3.2 Component: autocomplete (RSyntaxTextArea)
  - To version 3.4.0 Component: languagesupport (RSyntaxTextArea)
  - To version 3.3.1 Component: rstaui (RSyntaxTextArea)
  - To version 3.6.0 Component: rsyntaxtextarea
  - To version 1.9.0 Component: commons-cli
  - To version 3.1.12 Component: commons-compiler
  - To version 1.12.0 Component: commons-csv
  - To version 9.2.1 Component: cron-utils
  - To version 2.11.0 Component: gson
  - To version 33.3.1 Component: guava
  - To version 2.18.0 Component: jackson-annotations
  - To version 2.18.0 Component: jackson-core
  - To version 2.18.0 Component: jackson-databind
  - To version 3.1.12 Component: janino
  - To version 1.0.24 Component: jcommon
  - To version 1.5.5 Component: jfreechart
  - To version 2.27.3 Component: Jsch (replacing ganymed-ssh2)
  - To version 2.5.0 Component: juniversalchardet
  - To version 2.0.5 Component: sql-formatter
  - To version 1.1.7 Component: syslog-java-client
  - To version 2.4 Component: velocity-engine-core
  - To version 3.7.0 Component: jquery
  - To version 1.13.2 Component: jquery UI
  - To version 2.9.2 Component: jquery-contextmenu
  - To version 3.1 Component: bootstrap-daterangepicker

### DbxCentral - The central WEB console to view Trend Graphs

- Removing a server, now also removes Daily Summary Reports
- New option when reading charts. sampleType=MIN_OVER_{SAMPLES|MINUTES} ... This is useful when for example looking ad Space Used... We might want to see the Minimum vales (within the sample/minutes) for 'Free Space'
  - `MIN_OVER_SAMPLES` Only take the MIN value from X samples, this can be used if there are to many samples
  - `MIN_OVER_MINUTES` Only take the MIN value from a sample over X minutes, this can be used if there are to many samples
- Alarm view (at the bottom): New checkbox to view/alarm in a formated way (like we see it in mail)
- Active Statements popup: Most checkboxes, now have a modal view where details will be visible. Like:
  - SQL Text
  - Lock Table
  - Blocking Information
  - Sybase ASE -- Showplan as a Text Representation
  - SQL Server -- Showplan as a HTML/GUI plan, with SQL Statement, Compile/Runtime Parameters, The XML plan itself
  - Postgres -- Showplan as a HTML/GUI plan, with SQL Statement, The JSON/Text plan itself
- Historical view of Active SQL Statements (you can view executed SQL Statements from a History View, by clicking on the "History" button or by clicking on a "line" on any graphs), historical SQL Statements are saved for 60 days (can be configured with `CentralPcsJdbcCleaner.history.cm.keep.days=##`
- Menu: Server - Available offline databases -- Now a download link so we can download the OFFLINE database to your Client and view data with the native interface
- Selectize: Remember last entered text after choosing a entry. (no need to copy paste the selected text)
- Shutdown grace period was changed from 60 seconds to 180 seconds (2.5 minutes)
- Alarms for Local Metrics is disabled first hour of the day (00:00 - 01:00)
- Created a: Web Access/Request log (can be turned off with config: DbxTuneCentral.web.createRequestLog = false
- 'Show Local DbxCentral (OS) Metrics' has been added as a "Profile" so it can easily be accessed at the start page
- In 'Overview', added links to 'Show Local DbxCentral (OS) Metrics'
- Local Metrics: After startup, some alarms are diabled for 5 minutes (during restart, there will be "heavy load" due to all DbxTune collectors starts at the same time.
- Added "Exception handler" to intercept some Exceptions and restart the server if they happens (like OutOfMemoryError and H2 'The database has been closed')
- PCS JDBC Cleaner -- added some more trace statements to detect what oldest date that will be deleted
- First steps on remote configure a collector, for now just 'view' a collector. Click on the server name and choose 'View/Change Collector Configuration'
- In History view: Show a spinning bussy icon when fetching old Active Statements
- In History view: Also better performance (postponing update of the "time bar" within graps)
- removed some file access with relative path name, and list file options for some directories
- You must be logged in to download recording files, and to remove Daily Summary Report files
- User Defined Charts got some new parameters, and also reload some parameters (like SQL) if the underlying file was changed
- On landing page: For SQL Server entries: Added right click meny items for: 'SQL Agent/Scheduler Report for Today' and 'SQL Agent/Scheduler Activity Vire for Today'
- SQL Server Showplan -- are now zoomable (in Active Statements modal)
- Graph -- Time Selection -- Added: Start Time +#h... to make it easier to extend the current time selection
- Alarms for Disabled servers are not shown anymore
- added URL Options for; 'markTime', 'markStartTime', 'markEndTime' to visualize start/end time for "interesting" time spans
- Preparing for SSL connectivity in the Web Server, however ot yet tested... (if the files 'cert.pem', 'key.pem', 'chain.pem' exists in directory 'conf/ssl/')
- DbxCentral 'DbxCentral.info' file is now written in the correct directory
- DbxCentral.info now also holds 'dbxtune.central.port', 'dbxtune.central.log.file', 'dbxtune.central.config.file', 'dbxtune.management.host', 'dbxtune.management.port', 'dbxtune.management.info'
- DbxCentral.info 'dbxtune.management.shutdown.url' can be used to shutdown DbxCentral (this is used from the Windows Service to shutdown)
- Central PCS Database 'Drop Empty Columns' Cleanup - Scheduling Task
- On Windows default port for the WebServer is 80 (instead of 8080, because it's harder to do redirects using the firewall)
  This can also be overridden with Property 'DbxTuneCentral.web.http.port.windows=####' and 'DbxTuneCentral.web.https.port.windows=####'

### AseTune - Sybase/SAP Adaptive Server Enterprise

- Changing 'RangeSlider' from 'com.jidesoft.swing.RangeSlider' to a "home made" (which is ugly but works). The JIDE did not work under Java 17 (we will se in the future if I change back)
  Note: This is only used in: Capture SQL, Offline View
- ASE Configuration -- Slightly better at some parameters to describe memory usage in MB/GB
- Added Tool 'ASE Statement Cache Bloat Report...'
- CmActiveStatement - tab: Active Statements
  - Added column 'HasLastKnownSqlText' -- Has values in column 'LastKnownSqlText'
  - Added column 'LastKnownSqlText' -- Holds the last known SQL Text executed by this SPID, KPID and BatchId, NOTE: Recording Must be enabled.
  - Added column 'TranName' -- The transaction name. (from sysprocesses.tran_name
  - Added column 'ConnectionTime' -- When did the client login to ASE
  - BlockingOthersMaxTimeInSec:AlarmEventBlockingLockAlarm -- Added some more details "Process Activity for SPID", "Process Activity for BLOCKED/WAITING SPI" and "Last Known SQL Text for BLOCKED/WAITING SPID"
- CmDeviceIoPanel - tab: Devices
  - If 'AvgServ_ms' is above 10ms, then make the cell background "red" (only in the GUI application)
- CmErrorLog - tab: Errorlog
  - Added 'CmErrorLog.alarm.system.on.BackgroundMessage.keep.regex', 'CmErrorLog.alarm.system.on.BackgroundMessage.skip.regex' so we can keep/skip some messages in alarm 'BackgroundMessage'
- CmOpenDatabases - tab: Databases
  - OldestTranInSeconds:AlarmEventLongRunningTransaction -- Added som more details "Last Known SQL Text for 'Oldest Open Tran' SPID"
  - Add column 'DBCreateTime', so we can see when a database was created.
  - Alarm LastBackupFailed now has a "guess" if it was a transaction log or database dump that failed
  - New graph 'TempDB Space Max-Size and Used-Size in MB'
  - Added columns 'LastDbBackupDurationDhms', 'LastLogBackupDurationDhms', 'BackupEndTime', 'LastTranLogEndDumpTime'
- CmSpMonitorConfig - tab: sp_monitorconfig
  - New Graph 'MetaData Cache Reuse Count' for 'number of open objects', 'number of open indexes', 'number of open partitions'
  - New Alarm ConfigResourceIsReused when 'number of open objects', 'number of open indexes', 'number of open partitions' is reused above 10 times per sample period. (controlled by 'CmSpMonitorConfig.alarm.system.if.NumberOfOpenObjects.ReuseDiff.gt=#', 'CmSpMonitorConfig.alarm.system.if.NumberOfOpenPartitions.ReuseDiff.gt=#', 'CmSpMonitorConfig.alarm.system.if.NumberOfOpenIndexes.ReuseDiff.gt=#')
- CmProcessActivity - tab: Processes
  - Added column 'HasLastKnownSqlText' -- Has values in column 'LastKnownSqlText'
  - CmProcessActivity Added column 'LastKnownSqlText' -- Holds the last known SQL Text executed by this SPID, KPID and BatchId, NOTE: Recording Must be enabled.
  - Added local Setting 'Get Last Known SQL Text (all)'
- CmSummary - tab: Summary
  - AlarmEventBlockingLockAlarm, attaches information from 'CmProcessActivity' about "oldestOpenTranSpid"
  - AlarmEventLongRunningTransaction, attaches information from 'CmProcessActivity' about "oldestOpenTranSpid"
  - LockWaits:AlarmEventBlockingLockAlarm -- Added some more details "Last Known SQL Text for 'Oldest Open Tran' SPID"
  - oldestOpenTranInSec:AlarmEventLongRunningTransaction -- Added some more details "Last Known SQL Text for 'Oldest Open Tran' SPID"
  - New Graph 'ASE Operations - Logical Reads in MB per second'
- CmStatementCache - tab: Statement Cache
  - New Graphs 'Statement Cache Add/Remove Count, per Sample Period', 'Statement Cache Memory Usage', 'Number of Statement in the Statement Cache'
- CmStmntCacheDetails - tab: Statement Cache Details
  - added column 'AvgReadEfficiancy' -- A Percent Calculation of AvgScanRows and AvgQualifyingReadRows
  - added column 'AvgWriteEfficiancy' -- A Percent Calculation of AvgScanRows and AvgQualifyingWriteRows
- CmStmntCacheHistory - tab: Statement Cache History
  - New Collector: How many entries are old vs new, grouped by hours (for last 24 hour), then by day. This will help to see if we are constantly creating new Statements or if we are reusing already existsing Statement Cache Entries.
- CmSqlStatement - tab: SQL Statements
  - Add filter to alarm 'errorCount' so we can "skip" some error numbers. 'CmSqlStatement.alarm.system.if.errorCount.skipMsgNumberCsv=1111, 1112, 1113'
  - Experimental: New columns 'cntQueryOptimizationTimeGtZero', 'cntQueryOptimizationTimeGtZeroAbs', 'sumQueryOptimizationTime', 'sumQueryOptimizationTimeAbs', 'avgQueryOptimizationTime', 'maxQueryOptimizationTime'. NOTE: they may go away in next release.
  - Experimental: New Graphs 'Sum Query Compile/Optimization Count per sec Over SQL Response Time', 'Sum Query Compile/Optimization Time Over SQL Response Time'
  - Alarm 'ClientErrorMsgRate' now also includes last SQL text that produced the error number.
- CmSqlStatementPerDb - tab: SQL Statements/DB
  - Experimental: New Graphs 'SQL Statements Per DB - Sum Query Compile/Optimization Count per Sec', 'SQL Statements Per DB - Sum Query Compile/Optimization Time', 'SQL Statements - Sum Query Compile/Optimization Type Count per Sec'
  - Experimental: New columns 'cntQueryOptimizationTimeGtZero', 'cntQueryOptimizationTimeGtZeroAbs', 'sumQueryOptimizationTime', 'sumQueryOptimizationTimeAbs', 'avgQueryOptimizationTime', 'maxQueryOptimizationTime'. NOTE: they may go away in next release.
  - Experimental: New columns 'compileCount', 'compileCountAbs', 'compileCount_withTime_gt10_lt100', 'compileCount_withTime_gt100_lt1000', 'compileCount_withTime_gt1000', 'sumCompileTime', 'sumCompileTimeAbs', 'avgCompileTime', 'maxCompileTime', 'compileCount_pureLang', 'compileCount_pureLangAbs', 'compileCount_pureLang_withTime_gt10_lt100', 'compileCount_pureLang_withTime_gt100_lt1000', 'compileCount_pureLang_withTime_gt1000', 'sumCompileTime_pureLang', 'sumCompileTime_pureLangAbs', 'avgCompileTime_pureLang', 'maxCompileTime_pureLang', 'compileCount_langInStmntCache', 'compileCount_langInStmntCacheAbs', 'compileCount_langInStmntCache_withTime_gt10_lt100', 'compileCount_langInStmntCache_withTime_gt100_lt1000', 'compileCount_langInStmntCache_withTime_gt1000', 'sumCompileTime_langInStmntCache', 'sumCompileTime_langInStmntCacheAbs', 'avgCompileTime_langInStmntCache', 'maxCompileTime_langInStmntCache', 'compileCount_dynamicInStmntCache', 'compileCount_dynamicInStmntCacheAbs', 'compileCount_dynamicInStmntCache_withTime_gt10_lt100', 'compileCount_dynamicInStmntCache_withTime_gt100_lt1000', 'compileCount_dynamicInStmntCache_withTime_gt1000', 'sumCompileTime_dynamicInStmntCache', 'sumCompileTime_dynamicInStmntCacheAbs', 'avgCompileTime_dynamicInStmntCache', 'maxCompileTime_dynamicInStmntCache'. NOTE: they may go away in next release.
- SQL Capture
  - Save last 20 exeecuted SQL Text for every SPID, this so we can grab "Last Known SQL Text" in various CM's
- Daily Summary Report
  - Added SQL Statement Execution Statistics per Database (origin: CmSqlStatementPerDb / monSysStatement)
  - Added 'AseStmntCacheHistory'
  - Added 'AseTopCmStmntCacheDetails' -- Top Statement Cache Entries by CPU Time below ### ms (order by: TotalCpuTime__sum, origin: CmStmntCacheDetails / monCachedStatement)
  - Added 'AseTopCmStmntCacheDetails' -- Top Statement Cache Entries by USE/Exec Count (order by: UseCount__sum, origin: CmStmntCacheDetails / monCachedStatement)
  - Added 'AseTopCmStmntCacheDetails' -- Added graphs 'Statement Cache Add/Remove Count, per Second', 'Statement Cache Add/Remove Count, per Sample Period', 'Number of Statement in the Statement Cache', 'Statement Cache Memory Usage, in KB'
  - In 'Normalized SQL Text', when showing details, added 'min' and 'max' for: elapsed_ms, cpuTime, waitTime, logicalReads, physicalReads, rowsAffected, memUsageKB.
  - In 'AseCpuUsageOverview' -- Added 2 graphs 'SQL Statements Per DB - Sum Query Compile/Optimization Count (Object/Access->SQL Statements/DB)', 'SQL Statements Per DB - Sum Query Compile/Optimization Time (Object/Access->SQL Statements/DB)'
  - In 'AseTopSlowNormalizedSql' -- Also include 'QueryOptimizationCount' and 'QueryOptimizationTime' for each entry. NOTE: This is in Experimental mode (and may be changed/removed in the future)
  - In 'AseTopSlowNormalizedSql' -- Added a 'note' below each 'small graph' with some info about how many entries we have in the Statement Cache, and Compile time info, in RED if it looks like we spend to much time in compilation.
  - In 'AseCpuUsageOverview' -- Added 'SQL Batches/Statements Processed Per Second (Server->Processes)', 'ASE Operations - Logical Reads in MB per Second (Summary)'
  - In 'ErrorInfo' -- Each Group of errors is now 'collapsable'

### IqTune - Sybase/SAP IQ (The Column Storage Database)

- xxx

### RsTune - Sybase/SAP Replication Server

- Set description to 'Experimental' in the 'Monitor & Counters' tab. Some work was done here, but it still needs more work
- WarmStandby - When updating Active databases, now include what user name this was done with (for easier trouble shooting, if no replication... maint_user...)
- CmWsRepLatency - Now works better if we do NOT have any Warm Standby Connections
- CmWsRepLatency - Alarms for RsReplicationAge does now also contain some graph history
- CmRsMemory - Alarms for RsMemoryUsage does now also contain some graph history
- Daily Summary Report - Added RsMemoryUsage, with grphs how memory was used

### RaxTune - Sybase/SAP Replication Agent X

- No changes, please request some if you want this tool to evolve

### HanaTune - SAP HANA

- No changes, please request some if you want this tool to evolve

### OracleTune - Oracle Database

- No changes, please request some if you want this tool to evolve

### SqlServerTune - Microsoft SQL-Server

- setNetworkTimeout to default value of 60 seconds. (this can be changed with property 'SqlServerTune.onConnect.setNetworkTimeout.ms'
  This will help when the server is "unresponsive", so we can disconnect ant try to make a new connection... and hope for the best...
- Changed most CounterModels to need role 'VIEW SERVER STATE' so that users with "sufficient permission" dont get hammered in the error log
- Warn users that "do not have sufficient permission", and copies the grant SQL Statements for fix it into the Copy Paste Buffer
- Added retryable error message 18401 -- Login failed for user 'dbxtune'. Reason: Server is in script upgrade mode.
- DbmsObjectIdCache - Handle error 976 -- The target database, 'xxx', is participating in an availability group and is currently not accessible for queries.
- Added SqlAgentJobInfoCache, which get's reloaded every 4 hour. (set refresh rate with: SqlAgentJobInfoCache.refresh.interval.minutes=###)
- All CounterModels with column "program_name" and it contains a JobId and StepId the real names will be used from SqlAgentJobInfoCache (disable with: SqlServerTune.CmAny.resolve.sqlAgent.programName.enable=false)
- PCS Transfer new QueryStore tables for SQL Server 2022
- a bunch of cm's -- Get 'context_info' from 'dm_exec_requests' instead of 'dm_exec_connections'
- DbmsObjectIdCache -- on "Msg 208, Text='Invalid object name 'xxxx'.'" simply clear the cache for that dbid
- UserDefinedTimelineChart -- new option: onlyLevelZero={true|false} to only show "top" levels for 'SQL Agent Jobs'
- Modified 'html-query-plan' to show some more information (the developer at https://github.com/JustinPealing/html-query-plan didn't respond to any issues, so I cloned the repo and made changes... Trying to get them to accept a Pull Request)
- Switch from getting 'html-query-plan' from 'cdn.jsdelivr.net' to 'www.dbxtune.com' so I can use my changed/enhanced version.
- Connect: if 'dbmsUsername' is 'integratedSecurity' then use Windows Authentication for current user
- Added Alarm: AlarmEventMemoryGrantWait -- Used by CM 'CmMemoryGrantsSum' to alarm if we have anyone waiting to grab a memory grant.
- Added Alarm: AlarmEventLowOnWorkerThreads -- which will be raised when we have 20 or less "worker threads" available (called from CmSummary)
- Added Alarm: AlarmEventOutOfWorkerThreads -- which will be raised when we have no more "worker threads" available (called from CmSummary)
- Added Alarm: AlarmEventToxicWait -- which will be raised when checking "Server Wait Time", wait events (called from CmWaitStats)
- Added Alarm: AlarmEventDeadlock -- if we had any deadlocks... (within a MovingAverage over 10 minutes), (called from CmSummary)
- Added Alarm: MemoryClerkWarning -- when a Memory Clerk goes above threshold and possibly needs attention (called from CmMemoryClerks)
- Added Alarm: AlarmEventHighVirtualLogFileCount -- if 'vlf_count' is higher than 5000 (alarm parameter 'CmDatabases.alarm.system.if.vlf_count.gt=####') (called from CmDatabases)
- Added Alarm: AlarmEventSqlAgentStatus -- if SqlAgent seems to be in incorrect status (CmSummary.alarm.system.sqlAgent.expected.status=regex) (called from CmSummary)
- Added CM: CmExecQueryStatPerDb - Activity Grouped by Database -- Information is fetched from dm_exec_query_stats
- Added CM: CmMemoryGrantsSum - A Memory Grant Summary (from: dm_exec_query_resource_semaphores)
- Added CM: CmWaitStatsPerDb - What are we waiting on, at a database level (from: dm_exec_session_wait_stats/dm_exec_sessions)
- Added CM: CmWhoIsActive - Execute sp_whoIsActive from Adam Machanic
- Added CM: CmIndexOpStatSum - Index Op Sum -- Get Table Level Information (like Ins/Upd/Del, lock_wait_time/count etc) on a Database Level
- DBMS Configuration - Also get linked servers using 'exec sp_linkedservers'
- DBMS Configuration - if Linux also grab file content of '/var/opt/mssql/mssql.conf' in tab 'Server Registry' note: this needs permission 'ADMINISTER DATABASE BULK OPERATIONS'
- DBMS Configuration - (if windows) Check: Windows Power Plan (this is done via OS Command 'powercfg /list')
- DBMS Configuration - (if windows) Check if AllocationUnitSize is smaller than 64K (this is done via OS Command 'powershell "Get-Volume | Select-Object DriveLetter, AllocationUnitSize, FileSystemType, FileSystemLabel | ConvertTo-Json"')
- DBMS Configuration - Added 'sp_blitz' -- which is a Stored Proc from Brent Ozar that does various "healthchecks" on the server. (it's only executed if it's installed in the SQL Server)
- DBMS Configuration - Scoped configurations was only comming from current database (master)
- DBMS Configuration - If sp_Blitz is older than 6 month, raise a DbmsConfigIssue
- DBMS Configuration - Added some new defaults for 'CTR cleaner lock timeout (secs)', 'Log records threshold to abort txn', 'Log size threshold to abort txn', 'SLOG memory quota percentage', 'TempDB log records threshold', 'TempDB log size threshold', 'external rest endpoint enabled', 'external xtp dll gen util enabled'.
- DBMS Configuration - 'SysMasterFiles' is not supported by 'Azure SQL Database'
- DBMS Configuration - 'msdb.dbo.suspect_pages' is not supported by 'Azure SQL Database'
- DBMS Configuration - 'SqlServices' is not supported by 'Azure SQL Database'
- DBMS Configuration - 'ClusterNodes' enhanced to check more information depending on what SQL Server instance we are running on.
- Host Monitoring - on connect -- kill all processes of 'typeperf.exe', since the SSH Server does NOT terminate them on disconnet (like i Unix system does)
- Host Monitoring - on Windows: CmOsPs: now with a Graph on CPU Usage per Process, also a "top" processes table are included on some Alarms
- Host Monitoring - on Windows: MonitorDiskSpace -- Changed from using 'Get-CimInstance Win32_LogicalDisk' to 'System.IO.DriveInfo]::GetDrives()' which needs lower authorization.
- CmActiveStatements - Added column 'tran_id' it relates with Extended Events 'transaction_id'. (easier to track SqlServerTune and XE)
- CmActiveStatements - Rewrote a sub select into a join (for better performance)
- CmActiveStatements - added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- CmActiveStatements - added new columns 'memory_grant_requested', 'memory_grant_wait_time_ms', 'requested_memory_kb', 'granted_memory_kb', 'used_memory_kb', 'used_memory_pct'
- CmActiveStatements - Changed "multiSampled" from 'StartTime' to 'StartTime' AND 'StmntStart' (that is if we are in a procedure)
- CmActiveStatements - ImBlockingOthersMaxTimeInSec:AlarmEventBlockingLockAlarm added "skip" capability for columns: 'login_name', 'HOST_NAME', 'database_name', 'program_name', 'ProcName' -- default is to skip 'program_name' with "Report Server"
- CmActiveStatements - HoldingLocksWhileWaitForClientInputInSec:AlarmEventHoldingLocksWhileWaitForClientInput added "skip" capability for columns: 'login_name', 'HOST_NAME', 'database_name', 'program_name', 'ProcName' -- default is to skip 'program_name' with "Report Server"
- CmActiveStatements - Mark "dop" where dop > 1 with a green color, just for easier spotting if it uses Paralell workers (this is also changed in DbxCentral)
- CmActiveStatements - New columns to track "SPID Wait Info": 'SpidWaitCountSum', 'SpidWaitTimeMsSum', 'HasSpidWaitInfo', 'SpidWaitInfo'. The information is fetched from CmSpidWait (if not enabled, no info will be available)
- CmActiveStatements - Added column 'sql_handle' to better track "multiSampled" SPID/row
- CmActiveStatements - Added column 'tran_begin_time' -- If we have a long running statement we may also want to see the 'tran_begin_time'
- CmActiveStatements - Changed logic for 'getLockSummaryForSpid', to handle timeouts in another way
- CmActiveStatements - Added columns 'exec_phys_reads_mb', 'exec_logical_reads_mb', 'exec_writes_mb', which is just a recalculation of pages into MB
- CmActiveStatements - Added column 'HasBufferSqlText'. 'LastBufferSqlText', which shows the SQL Statement in the "input buffer"
- CmActiveStatements - Added column 'wal_record_count', 'wal_kb_used' to see how much WAL (Write Ahead Log or Transaction log) is used by any DML opterations.
- CmActiveStatements - Added column 'estimated_compl_time_dhms', which will display in '#days #hours #minutes #seconds' until the command is completed
- CmActiveStatements - Added some output to tooltip on 'wait info' (like: 'dop' and 'WaitTimePct')
- CmActiveStatements - Blocking Lock's... Adding more info to 'BlockedSpidsInfo'. ExtraInfo: login_name, program_name, context_info_str, HOST_NAME, ProcName, command, tran_begin_time, tran_name, SpidLockCount, database_name, wait_time, wait_resource
- CmActiveStatements - Added columns 'ExecTimeHms', 'UsefullExecTimeHms' (easier read of long running statements)
- CmActiveStatements - in AzureDB: Skip rows with program_name 'TdService'
- CmAlwaysOn - Performance enhancement
- CmAlwaysOn - Initial check if 'IsHadrEnabled' is NOT enabled... then: do disable this CM
- CmAlwaysOn - New Graph 'AlwaysOn Average Transaction/Commit Delay, in Milliseconds'
- CmAlwaysOn - New column 'p_AvgTransactionDelayMs'
- CmAlwaysOn - Connect to remote server was enhanced. If FDN is specified when connectiong to server. but in 'sys.availability_replicas' column 'replica_server_name' (if I remember correctly) it's just a plain hostname, then append the domain name.
- CmDatabases - added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- CmDatabases - added new columns 'DataOsDiskLabel', 'LogOsDiskLabel' (this so we in Graphs and alarms can say "E: [SQL Data]"
- CmDatabases - added new columns 'collation_name'
- CmDatabases - Added column 'is_read_only'
- CmDatabases - if database is in status "SINGLE_USER", (it wont be investigated), then set Alarm "Time To Live" to 10 minutes, so we don't CANCEL/RASE the alarm to often!
- CmDatabases - On Windows add the 'disk label' to the 'drive name' for easier determination of what the disk may be used for
- CmDatabases - Changed logic for 'getLockSummaryForSpid', to handle timeouts in another way
- CmDatabases - Rewrite of 'sp_MSforeachdb' into a cursor loop, that execute all SQL Statements that needs "database context"
- CmDatabases - Rewrite from 'sys.dm_db_file_space_usage' into "FILEPROPERTY(name, 'SpaceUsed')" which seems much cheaper
- CmDatabases - Added column 'create_date' so we can see when the database was created.
- CmDatabases - Added columns 'rcsi', 'si_state' and 'adr' so its' easier to se if ReadCommittedSnapShot/SnapshotIsolation/AcceleradeDatabaseRecovery has been enabled for a specific database.
- CmDatabases - in GUI Mode: If 'LogSizeOnMb' is larger than 'DatabaseSizeInMb' then mark that cell as RED
- CmDatabases - New Column 'vlf_count'
- CmDatabases - if 'AzureDb' Skip Availability Group checking
- CmDatabases - if 'AzureDb' skip suser_sname(xxx)... and just do: DBOwner = 'AzureDB'
- CmDatabases - new alarm 'HighVirtualLogFileCount' if 'vlf_count' is higher than 5000 (alarm parameter 'CmDatabases.alarm.system.if.vlf_count.gt=####')
- CmDatabases - new column 'db_scoped_nondefault_configs' which holds Database Scoped Configuration that is NOT Default
- CmDatabases - new Alarm if 'db_scoped_nondefault_configs' has changed
- CmDeviceIo - LogicalName - is now based om dbname and file_id (instead of master_files.name, which may not be unique enough)
- CmDeviceIo - Added new columns 'lname' (master_files.name), which is the 'old' LogicaName.
- CmDeviceIo - Added columns 'AvgReadKbPerIo', 'AvgWriteKbPerIo'
- CmDeviceIo - Added charts 'Disk Throughput in KB (Sum,Read,Write)', 'Number of Disk Operations (Sum,Read,Write)', 'Average (Read) KB Per Disk IO, per Device', 'Average (Write) KB Per Disk IO, per Device'
- CmDeviceIo - Sometimes we had Arithmetic overflow due to high counter values
- CmDeviceIo - If 'AvgServ_ms' is above 10ms, then make the cell background "red" (only in the GUI application)
- CmExecFunctionStats - Get data for records that has been used for last 25 hours (configurable)
- CmExecProcedureStats - Get data for records that has been used for last 25 hours (configurable)
- CmExecTriggerStats - Get data for records that has been used for last 25 hours (configurable)
- CmExecQueryStat - DEFAULT_sample_lastXminutesTime changed from 30 minutes to 6 hours
- CmExecQueryStatPerDb - If we get 10 sequential "timeouts" when getting data, then disable this CM, until a new recording period starts
- CmMemoryClerks - If the Clerk 'USERSTORE_TOKENPERM' is above '2048' (2GB), then raise Alarm 'MemoryClerkWarning'. config: `CmMemoryClerks.alarm.system.if.USERSTORE_TOKENPERM.gt=####`
- CmMemoryGrantsSum - For alarm AlarmEventMemoryGrantWait, attach details from CmMemoryGrants
- CmOpenTransactions - added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- CmOpenTransactions - Changed logic for 'getLockSummaryForSpid', to handle timeouts in another way
- CmOptimizer - Add column 'pct', which calculates the percent of "some" keys.
- CmOptimizer - Add Graph "Optimizer Statistics by Key per Second"
- CmPerfCounters - Added Chart 'Stolen Server Memory, from Buffer Pool'
- CmPerfCounters - Added Chart 'DeadlockDetails'
- CmPerfCounters - Added Chart 'ColumnStoreAll'
- CmPerfCounters - Changed NEGATIVE_DIFF_COUNTERS_TO_ZERO from false to true
- CmPerfCounters - new chart 'CachePhyReadAheadPct' -- Buffer Cache Physical Readahead Percent
- CmPerfCounters - new chart 'SQL Errors' -- with lines: 'Total', 'Info Errors', 'User Errors', 'Kill Connection Errors', 'DB Offline Errors'
- CmSchedulers - Changed NEGATIVE_DIFF_COUNTERS_TO_ZERO from false to true
- CmSchedulers - Added graph -- CPU Usage in Percent, Both Average and Per Schedulers (using dm_os_schedulers.total_cpu_usage_ms)
- CmSessions - The "hidden report" on WaitResources has been extended (can now lookup pages to get ObjectID's and translated to ObjectName's, also lookup 'locked data' when WaitResource is 'KEY')
- CmSessions - Added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- CmSessions - Added column 'ExecTimeHms' (easier read of long running statements)
- CmSessions - Alarm 'LongRunningStatement'. Added option to skip some program names. 'StatementExecInSec SkipProgramNames' Property: CmSessions.alarm.system.if.StatementExecInSec.skip.progName=regex, default '(TdService)'
- CmSpidWait - Changed NEGATIVE_DIFF_COUNTERS_TO_ZERO from false to true
- CmSummary - Adjustments for "users with sufficient permission", more sensitive to what SQL Statements that are executed
- CmSummary - added column 'databaseCacheMemoryMb', 'grantedWorkspaceMemoryMb', 'stolenServerMemoryMb' (grabbed from dm_os_performance_counters)
- CmSummary - added Chart 'PerfMon: SQL Server Memory Usage'
- CmSummary - added columns "maxWorkers", "usedWorkers", "availableWorkers", "workersWaitingForCPU", "requestsWaitingForWorkers", "allocatedWorkers"
- CmSummary - added Chart "WorkersThreadUsage" -- to see the behaviour of Worker Thread Usage
- CmSummary - added Chart "WtWaitingForCpu" -- SQL Server Worker That are Waiting for CPU to be Scheduled
- CmSummary - added Chart "TasksWaitForWorkers" -- Tasks/Requests that are Waiting for Available Worker Threads
- CmSummary - added Chart "DeadlockCountSum" -- How many deadlocks did we have in last "sample"
- CmSummary - new columns: RootBlockerSpids
- CmSummary - new columns: deadlockCount
- CmSummary - alarm 'AlarmEventBlockingLockAlarm', attach info from "CmSessions" about "RootBlockerSpids" and "oldestOpenTranSpid"
- CmSummary - alarm 'AlarmEventLongRunningTransaction', attach info from "CmSessions" about "oldestOpenTranSpid"
- CmSummary - alarm 'AlarmEventDeadlock' if we had any deadlocks... (within a MovingAverage over 10 minutes)
- CmSummary - new chart 'MemoryPressure' -- Memory Pressure, with columns 'osMem_system_high_memory_signal_state', 'osMem_system_low_memory_signal_state', 'memProcessPhysicalMemoryLow', 'memProcessVirtualMemoryLow'
- CmSummary - for some columns 'io_total_read', 'io_total_write', 'pack_received' 'pack_sent', 'packet_errors' -- Set negative counters to 0
- CmSummary - Alarm 'AlarmEventOutOfWorkerThreads' -- adding some charts from 'CmWaitStats'
- CmSummary - if 'AzureDb' do not check 'suspectPageCount' and 'suspectPageErrors' because AzureDB do not have 'msdb.dbo.suspect_pages'
- CmSummary - if 'AzureDb' or if user do not have 'VIEW SERVER STATE': do not check 'dm_os_sys_memory' and 'dm_os_process_memory'
- CmSummary - if 'AzureDb' or if user do not have 'VIEW SERVER STATE': do not check 'SQL Server Agent' status.
- CmSummary - New Alarm 'SqlAgentStatus' controlled by 'CmSummary.alarm.system.sqlAgent.expected.status=regex' with default value of '(Running|unknown:.*)'
- CmSummary - New column 'SQL Agent Status', to check/describe if 'SQL Agent' is up and running.
- CmTempdbSpidUsage - added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- CmTempdbSpidUsage - in AlarmEventTempdbSpidUsage also include information from CmActiveStatements
- CmTempdbSpidUsage - Getting "Active Statement" did not work to 100%
- CmWaitStats - Added Charts "ToxicTime", "ToxicCount", "ToxicTpw" (TPW=Time Per Wait) -- to see the Toxic wait event (if they are happening)
- CmWaitStats - Raising Alarm on Toxic Wait types "RESOURCE_SEMAPHORE", "THREADPOOL" if there has been more wait time than 10 seconds (can be changed with Properties 'CmWaitStats.alarm.system.if.wait_time_ms.RESOURCE_SEMAPHORE.gt', 'CmWaitStats.alarm.system.if.wait_time_ms.THREADPOOL.gt')
- CmWaitStats - alarm 'AlarmEventToxicWait', attach info from "CmMemoryGrants" about "Current Memory Grants, per SPID"
- CmWaitStats - removed 'CMTHREAD' from "Toxic Wait Type"
- CmWaitStats - removed 'CXCONSUMER' from getDefaultLocalGraphsSkipList()
- CmWaitingTasks - added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- CmWho - added new column 'context_info_str' which is a String interpretation of the binary field 'context_info'
- DDL Lookup - In "Object Lookup Inspection" added 'hasEagerIndexSpool'
- Daily Report
  - New section: Top Database Activity (order by: 'total_worker_time_ms__sum', origin: CmExecQueryStatPerDb/dm_exec_query_stats)
  - New section 'Deadlocks', which prints how many deadlocks we had in last 24 hours, and print information we got from sp_BlitzLock
  - new: SqlServerXxxYyy -- xxx
  - In the Recording info, Print the Edition: 'Standard Edition', 'Enterprise Edition', 'Web Edition', 'Developer Edition', 'Express Edition', or 'Azure'
  - In the Recording info, Print the 'Collation Name' and 'Collation Description'
  - In the "Overview" section, added some Graphs: 'CmPerfCounters_CachePhyReads', 'CmPerfCounters_CacheWrites', 'CmMemoryGrantsSum_GrantedMemSum' and 'CmSummary_OsMemoryFreeMb'
  - In the "Plan Cache History"" is no longer included in "short" report (Mail Reports)
  - In the "QueryStore" and "TopCmExecQueryStats" new column 'efficiency_pct' for this may help decide if we have (parallel) queries that are NOT effective
  - PCS - On Database Rollover, If we have seen any Deadlocks... extract them using 'sp_BlitzLock' and store them in the recording.
  - WaitStats -- Chart "Wait types for..." Instead of getting only CXPACKET, CXCONSUMER I now get all starting with CX*
  - in the "DB Information", If collation is not the same as tempdb, mark it as red
  - Fixed bug that skipped the "summary" section for ALL databases that has Query Store Enabled
  - Added chart 'CmOsIostat_IoBusyPct' to the "summary" section
  - Added Report Section for: Job Agent/Scheduler Information for the full day (origin: msdb.dbo.sysjobs, sysjobsteps, sysjobhistory)
  - Added 'logical_writes_MB', 'physical_reads_MB' in reports that has 'logical_writes', 'physical_reads'
  - For Windows... Include CmOsPs information about most active Processes (so we can see for example if the Virus Scan takes to much resourses)
  - Job Scheduler information is now much better (a lot of work was done here)
  - In 'Recording Information' print information about 'Deployment Type' (how it's clustered), and 'Availability Group Info' (where is it Primary and what Secondary Servers exists)
  - Added SqlServerIndexOpSumPerDb -- To graph how much of various Operations we have done in a database.
  - DB File IO -- Added columns 'AvgReadKbPerIo', 'AvgWriteKbPerIo' and SparcLines so we can see how large IO's we are using (to detect if we have enabled 64K Allocation Units on Windows)
  - Summary Section -- Added some graphs 'SQL Batches Received per Sec', 'Insert/Update/Delete Rows Per Second at Instance Level', 'Insert/Update/Delete Rows Per Second for tempdb', 'Bookmark/Singleton Lookups Per Second per Database', 'Range Scans Per Second per Database'
  - Added new section -- Database Operationals Summary (origin: CmIndexOpStatSum/dm_db_index_operational_stats)
  - Top SQL Statements -- If a SQL Text was executed from a Stored Proc, lets print the procedure name

### PostgresTune - PostgreSQL

- Added a new Collector Group 'Progress' with the following collectors: CmPgProgCluster, CmPgProgVacuum, CmPgProgAnalyze, CmPgProgIndex, CmPgProgCopy, CmPgProgBaseBackup
- BugFix: CatalogIterator -- Now skipps databases that we dont have access to (this was discovered when trying to use a GCP instance where some GCP database was protected by the 'pg_hba.conf' file
- CmActiveStatements - added new columns 'pid_exlock_count' -- How many Exclusive locks does this PID hold
- CmActiveStatements - added new columns 'im_blocked_max_wait_time_in_sec' -- This pid has been blocked for this amount of times (max wait time from pg_locks)
- CmActiveStatements - added AlarmEventHoldingLocksWhileWaitForClientInput, when a pid has been in state 'idle in transaction' but still has EXCLUSIVE locks in the database. Default Threshold is 300 Seconds (5 minutes)
- CmActiveStatements - The alarms 'StatementExecInSec' and 'OpenXactInSec' will no longer alarm if the column 'backend_type' is 'walsender'
- CmActiveStatements - The alarms 'OpenXactInSec' new threshold 1h (previously 30 minutes)
- CmActiveStatements - added column 'pid_advlock_count' -- How many Advisory Exclusive locks does this PID hold
- CmActiveStatements - added column 'multiSampled' -- if 'query_start' has not changed between two samples, markt the row as 'multiSampled'
- CmActiveStatements - new Column 'has_query_plan', 'query_plan' -- The 'query_plan' we get from CmErrorlog and the "auto_explain" functionality
- CmErrorLog - new Collector -- Look at the Postgres errorlog (also sends alarms for: PgChecksumFailure, PgDeadlock, PgInsufficientResources, PgInternalError, PgSystemError) and if "auto_explain" is enabled, saves Execution Plans, which can be used by CmActiveStatements
- CmPgActivity - if property 'CmPgActivity.sample.sslInfo=true' is set (default is false), then show new columns: ssl, ssl_version, ssl_cipher, ssl_bits, ssl_client_dn, sss_client_serial, sss_issuer_dn
- CmPgActivity - The alarms 'StatementExecInSec' will no longer alarm if the column 'backend_type' is 'walsender'
- CmPgActivity - Added graph for: Parallel Execution Usage
- CmPgActivity - New column 'worker_count', which counts number of worker thread for the 'leader_pid'
- CmPgActivity - For Parallel Workers, Sort/Group the rows with LeaderPid first, the the WorkerPid (workers are also marked with beige color)
- CmPgActivity - Columns 'execTimeInMs' and 'xactTimeInMs' is now of datatype bigint (long running statements may "overflow" an int value)
- CmPgArchive - When 'archived_mb_last_hour' is greater than 10240 MB (10 GB) then raise AlarmEventPgArchiveRate (property 'CmPgArchive.alarm.system.if.archived_mb_last_hour.gt=##')
- CmPgBufferCacheDet - new Collector -- Table names and size in the Buffer Cache -- Note: Depends on extenstion: pg_buffercache, which is created on first sample (if not exists)
- CmPgBufferCacheSum - new Collector -- Buffer Cache overall statistics. (from pg_buffercache_summary() function)
- CmPgBufferCacheACnt - new Collector -- Buffer Cache Clock-sweep access count statistics. (from pg_buffercache_usage_counts() function)
- CmPgDatabase - Alarm 'PgChecksumFailure' if 'checksum_failures' has accured. (and in the GUI also light them up as RED cells)
- CmPgDatabase - Only get databases size if we are authorized to access the database (this is mostly if we are monitoring with a user that do not have access to all databases, like in "the cloud")
- CmPgIo - new Collector -- IO Statistics by each backend type in the Postgres Instance. (from pg_stat_io), available from PG Version 16
- CmPgPidWait - new Collector -- What are the PID's waiting for (uses extension pg_wait_sampling)
- CmPgSrvWait - new Collector -- What are the server waiting for (uses extension pg_wait_sampling)
- CmPgProgAnalyze - new Collector -- Whenever ANALYZE is running, the pg_stat_progress_analyze view will contain a row for each backend that is currently running that command
- CmPgProgBaseBackup - new Collector -- Whenever an application like pg_basebackup is taking a base backup, the pg_stat_progress_basebackup view will contain a row for each WAL sender process that is currently running the BASE_BACKUP replication command and streaming the backup
- CmPgProgCluster - new Collector -- Whenever CLUSTER or VACUUM FULL is running, the pg_stat_progress_cluster view will contain a row for each backend that is currently running either command.
- CmPgProgCopy - new Collector -- Whenever COPY is running, the pg_stat_progress_copy view will contain one row for each backend that is currently running a COPY command
- CmPgProgIndex - new Collector -- Whenever CREATE INDEX or REINDEX is running, the pg_stat_progress_create_index view will contain one row for each backend that is currently creating indexes
- CmPgProgVacuum - new Collector -- Whenever VACUUM is running, the pg_stat_progress_vacuum view will contain one row for each backend (including autovacuum worker processes) that is currently vacuuming. Progress for VACUUM FULL commands is reported via pg_stat_progress_cluster because both VACUUM FULL and CLUSTER rewrite the table, while regular VACUUM only modifies it in place
- CmPgReplication - Changed the "tab name" from 'Replication' to 'Rep Stats', and created a new Group Tab to hold every CM with Replication
- CmPgReplication - Update a "dummy table" (postgrestune_ha_dummy_update) every # minute to induce transaction activity (this can be disabled with 'CmPgReplication.update.primary=false' or change interval with 'CmPgReplication.update.primary.intervalInSec=##')
- CmPgRepSlots - New CM to check 'pg_replication_slots', which raises AlarmEventPgReplicationLag when 'lag_kb' is greater than 100MB (config with: CmPgRepSlots.alarm.system.if.lag_kb.gt)
- CmPgTables - Added columns (for Diff calculation): n_tup_newpage_upd, n_ins_since_vacuum
- CmPgWalReceiver - New CM to check 'pg_stat_wal_receiver'
- CmPgWall - new chart: WAL KB Written per Second
- CmPgWall - new chart: WAL Buffer was Full Writes per Second
- CmPgWall - New Chart: pg_wal_dir Size in MB
- CmPgWall - new chart: New alarm AlarmEventPgWalSizeHigh when the WALL size gets "high"
- CmXxxx -
- CmXxxx -
- Alarm - new alarm: AlarmEventHoldingLocksWhileWaitForClientInput (threshold 1200 sec, 20 minutes)
- Object Inspector - Grabs more information on more object types: Foreign Data Wrappers (Remote Tables) and procedures, functions etc...
- DbmsObjectIdCache - now holds more information, to accomodate Foreign Data Wrappers (Remote Tables) and procedures, functions etc...
- DbmsObjectIdCache - Enhancement when getting data for missing entries
- DBMS Configuration - Added some Text config: 'DB Info', 'HBA Conf', 'Extentions', 'Servers', 'pg_config'
- DBMS Configuration - Warn about 'fsync=off'
- DBMS Configuration - Warn about 'autovacuum=off'
- DBMS Configuration - Configuration -- Altered length of columns 'section name', 'config name', etc... from 128 to 512 length
- DDL Lookup/Store - storage of Execution Plans (sent by CmErrorLog if "auto_explain" is enabled)
- Daily Summary Report - In the 'Recording info', Print if the DBMS is in 'Recovery/Standby Mode' or in 'Normal (r/w) Mode'
- Daily Summary Report - SQL Statement Information table now also holds information about 'Functions', 'Procedures', 'Remote Tables' (DDL Information and what tables they references, statistics on those tables)
- Daily Summary Report - Long Running Statements -- Content changes and adjustment for MS Outlook
- Daily Summary Report - Added section for 'Server Wait Stats'
- Daily Summary Report - Added section for 'IO Statistics' (from pg_stat_io)
- Daily Summary Report - Top TABLE/INDEX Activity -- Added some charts for: n_tup_ins__chart, n_tup_upd__chart, n_tup_hot_upd__chart, n_tup_newpage_upd__chart, n_ins_since_vacuum__chart
- Alarm - Added AlarmEventPgChecksumFailure -- Fired from CmErrorLog and CmPgDatabase
- Alarm - Added AlarmEventPgDeadlock -- Fired from CmErrorLog
- Alarm - Added AlarmEventPgInsufficientResources -- Fired from CmErrorLog
- Alarm - Added AlarmEventPgInternalError -- Fired from CmErrorLog
- Alarm - Added AlarmEventPgSystemError -- Fired from CmErrorLog

### MySqlTune - MySQL database

- No changes, please request some if you want this tool to evolve

### Db2Tune - IBM DB2 LWU

- No changes, please request some if you want this tool to evolve

### SQL Window

- Table/Cell ToolTip Better support to handle/display inline HTML content that dosn't start with '>html<'
- The "Copy Result" button can now also copy ResultSets into a JSON format (long or short)
- Enhancement with the backslash commands. They can now have comments etc prior to them
- \connect now works with with a section of code (multiple "go" batches)
- \rsql Can now omit the --sql 'sql text' and have the SQL Text "after" the \rsql command (at the next couple of lines)
- Changes for SQL Server JDBC Driver that supports message handler (new PR https://github.com/microsoft/mssql-jdbc/pull/2251 hopefully soon merged)
  This enables us to see messages from long running statement that sends feedback messages (like `BACKUP DATABASE` or `RAISERROR ('...', 0, 1) WITH NOWAIT`)
- For SQL Server get more details on table tooltip (added: In-Row data size, Index Size, LOB Size... so a bit more granular)
- Code Completion (for Postgres do not add *known* schema names, it just clutters the code)
- command 'toparquet' -- a first attempt to writet to Parquet Files (not implemented yet)
- right click menu -- "Get Foreign Key ***Child*** rows for selected rows(s)"
- right click menu -- "Mark all Words, on Double Click"
- In SQL Server, when doing 'go nodata' when 'set statistics profile on'... Then still show the ResultSet for 'statistics profile'
- for SQL Server -- Added 'Install some extra "system" procedures' (downloads from github)... Adam Machanic: Sp_WhoIsActive, Brent Ozar: Sp_Blitz*, Erik Darling: sp_*, Ola Hallengren: Maintenance Solution
- for SQL Server -- Added some shortcuts for the above procedures
- for SQL Server -- Showplan info: copy/save XML Plan formatted
- for SQL Server -- Showplan info: Now also holds "Execution Time" (if Available), "Cardinality Actual/Estimated Calculation" (if Available)
- for SQL Server -- Showplan info: Mark "Index Spool - Eager Spool" in color red... to highlight them a bit
- for SQL Server -- Code Compleation: Also includes "server up time" for statistics that depends on SQL Server restarts
- Adjusted tabSize to be 4 (it looked like it was 5 previously)
- For SQL Server: Code Completion -- Summary Information -- Did not show indexes for COLUMNSSTORE Indexes
- For Postgres: Code Completion -- Summary Information -- Did not show an accurate INCLUDE list for indexes
- A better implementation of 'Generate INSERT' for ResultSet selected rows
- in 'go nodata' option: Still present 'XML Showplan'
- RepServer: new "RCL command" -- alter connection to ${selectedText} set dsi_log_cmds to 'on/off'
- Tooltip on ResultSet tables, added "object lookup" on column name 'objectname|object_name|object name|tablename|table_name|table name'.
  AND: If columns 'dbname|databasename|database_name|database name' and 'schemaname|schema_name|schema name' exists the will be used to "fully qualify" the objectname
- Better handling of Showplans for SQL Server and Postgres
- InstallSqlFromUrlDialog -- use BOMInputStream to remove any BOM characters (Byte Order Mark)
- SQL Server: Tooltip on Tables now shows more information (Usage, and Operations) both on Indexes and HEAP Tables
- Postgres: in table information tooltip, show table owner.
- SQL Server: in table information tooltip, Make a better job for 'Column Store' tables.
- SQL Server: in table information tooltip, Lookup of tables in other databases did not work as expected. If the table is NOT in the local database. At the top: Print in BLUE what the database name is.
- \diff make a better job comparing UUID's on different DBMS Vendors
- go | bcp: added '-r,--strReplace' parameter. So we can change some strings "on the fly"
- go | bcp: added '-n,--slowBcpNoTran' parameter.
- Added 'Statement Cache Bloat Report' in Menu-Tools when Connected to Sybase ASE
- \set varname -- Now accepts "multi line" setting. (not by using
- On Connect: If various lookups takes longer than 1 sec after connecting, show a information dialog...
- Context menu to set 'default font', since it changes sometimes...

### Log Tail Tool

- No changes, please request some if you want this tool to evolve

## 2022-12-08

### Generic - Changes that affects all DbxTune tools

- Improved removal of old HPROF files
- Alarms Handeling:
  - New: AlarmEventClientErrorMsg -- If the AseSqlCapture part sees an Error Number that is severe, then raise alarm.
  - new: AlarmEventClientErrorMsgRate -- If we receive "bursts" of Client Error Messages (more than 10 per second), raise alarm.
  - new: AlarmEventSqlCaptureOldData -- If SqlCapture has "died" for some reason (not updating a timestamp), then raise alarm.
  - new: AlarmEventPerfCounterWarning -- (SQL-Server) - If a PerfCounter value is "out of whack"...
  - new: AlarmEventLongRunningStatement -- If a Statement has been running for more than X seconds/minutes/hours
  - new: AlarmEventExtensiveUsage -- for example if tempdb is heavely used
  - new: AlarmEventStackDump -- for SQL-Server only: Sends the StackDump as a chunk of text
  - new: AlarmEventOsSwapping -- if IN or OUT is above 5000. For Linux/Unix it's in 'CmOsVmstat', for Windows it's in 'CmOsMeminfo', also include a small chart of last 15 minutes
  - new: AlarmEventDbccCheckdbAge -- for SQL Server, when dbcc checkdb hasn't been executed.
  - new: AlarmEventHoldingLocksWhileWaitForClientInput -- When a SPID has started a transaction, but been idle at the Client side for more than X seconds.
  - new: AlarmEventBackgroundMessage -- ASE for errorlog messages starting with 'background task message:', which probably is a threshold procedure output.
  - new: AlarmEventOldIncrementalBackup -- SQL Server, old incremental backups
  - new: AlarmEventDbNotInHadr -- SQL Serverif we have any databases in HADR (Availability Groups) new databases should possibly be in there to...
  - new: AlarmEventDatabaseOption -- When a database option is changed (right now: only for Sybase ASE)
  - Changed: AlarmEventConfigResourceIsLow -- added "raiseDelay", which is used by 'Statement Cache Hit Rate', and the default was set to 5 minutes below configured value before raising alarm.
  - Changed: AlarmEventFullTranLog -- alwaysSend() is now set to true, so even if we do not "subscribe" for alarms on this server, we will still get message, just like SrvDown
  - Changed: AlarmEventProcedureCacheOutOfMemory -- alwaysSend() is now set to true, so even if we do not "subscribe" for alarms on this server, we will still get message, just like SrvDown
  - Changed: AlarmEventOldBackup -- added lastBackupStartTime to the alarm message
  - Changed: AlarmEventOldTranLogBackup -- added lastBackupStartTime to the alarm message
  - Changed: AlarmEventLongRunningTransaction -- Changed from Severity WARNING to INFO
  - Changed: AlarmEventHttpDestinationDown -- bugfix: was never canceled (it was kept due to 'hasUndergoneAlarmDetection' checks)
  - Changed: AlarmEventBlockingLockAlarm -- Added SPID to key, so we can have multiple alarms on blocking locks
  - Changed: AlarmEventOsSwapping -- Have a Max value where we "cap" off at, so that peaks will be removed and we see a Average without peeaks (the calculation is 1.5 of the threshold value)
  - Changed: OsLOadAverage -- Added a chart that shows what happened in the last hour
  - Changed: AlarmEventOsSwapping -- Added a chart that shows what happened in the last hour
  - Bugfix: Alarms may be canceled to early, if for example any 'timout' happened when the CM refreshed it's data (or other errors happened)
- AlarmWriterToMail: Changed temple for Subject to include ${severity}, also changed encoding to UTF-8
- All CM's -- SqlPrefix -- Prefix SQL Statements issued by the CounterModel with /* DbxTuneAppName:CmName */ so we can see in the daily report that it's AseTune / PostgresTune etc that are responsible for the SQL Statements issued
- new: Menu -> Tools -> 'Create Daily Summary Report...' Opens a dialog where you can produce a Daily Summary Report on any recording database.
- Focusable Tooltip is now resizable in a better way (all edges can be used)
- new cmdline interface `dsr.bat` or `dsr.sh` for Daily Summary Report
- Changed all CM's for Alarm Debugging to print threshold values earlier
- bugfix: Filter Field didn't allow [] in the column names (the bug was introduced when changing version of JSqlParser)
- NoGUI - if we have a previous connection, then do not exit (when checking for "proper monitoring configuration") when connecting.
- Enhanced som error messages, with ErrorCode, SqlState
- Fixed various small bugs by using 'SpotBugs'
- SshConnection: when passing a SQL-Server instance name with 'hostname\instance' only use the first part when connecting.
- NOGUI - better name checking for server name and Alias Names, not allowing '/', '\', ':', or ';'
- NOGUI - If we have a 'non-retryable error', like 'wrong password' do not continue in the 'retry' loop, instead throw Exception. This makes it easier to debug...
- NOGUI - Option to do Java Garbage Collection after each refresh/sample. In the properties file: no.gui.do.java.gc.after.refresh=true
- Injected comments about the origin of the Statement (se we can se that a stataement originates from DbxTune)
- AlarmWriterToMail: removed 'cc' property
- ReportSenderToMail: removed 'cc' and also added functionality to send mail based on to and server name (same config as for: AlarmWriterToMail)
- osLoadAverage Alarms is disabled between 00:00 and 02:00, when the Daily Summary Reports is created
- PCS: do not call "sp_depends" on objects during DDL Lookup
- SQL Inspector, if it sees a view, it tries to parse the view, and sent the referenced tables into the DDL Storage
- Added scheduling capabilities using 'cron4j'
- DBMS Configuration. Config Issues are now stored in PCS. And when loading a database the Issues are also available!
- Debug option for PCS DDL Storage. If property/EnvVar 'PcsAddDdlObjectDialog.show' is set to 'true' then a menu option "Add 'Object' for PCS DDL Lookup..." will be visible.
- OS Monitoring now also handles Windows, via a SHH Connection executing typeperf (not a OpenSSH Server needs to be installed on the Windows Server, supported modules
  - IO Stat, using: `typeperf -si 2 "\LogicalDisk(*)\*"`
  - VM Stat, using: `Not yet implemented`
  - MP Stat, using: `typeperf -si 2 "\Processor(*)\*"`
  - OS Load, using: `typeperf -si 2 "\System\*"` and also adding column 'nproc' and columns '*loadAverage*' load average is calculated based on Windows 'Processor Queue Length' using same algorithm (exponentially-damped moving averages) as Linux
  - OS Memory Info, using: `typeperf -si 2 "\Paging File(_Total)\*" "\Memory\*"`
  - Network Stat, using: `typeperf -si 2 "\Network Interface(*)\*"`
  - OS Disk Space Usage, using: `powershell "gwmi win32_logicaldisk | Format-Table -HideTableHeaders DeviceId, SizeKb, UsedKb, AvailableKb, UsedPct, DeviceId"`
  - For the above Host Monitoring CM's; Existing graphs (the same names as for Linux/Unix monitoring) is using the above, but some unique for Windows has been added
  - For Windows there are 3 extra graphs: "meminfo: Paging or Swap Usage", "meminfo: Paging File Usage", and "uptime: Windows Processor Queue Length"
  - Changed how timeout handling works when reading outout from OS Command
- OS Monitoring improvement for AIX 7.2 (where some columns in output for 'mpstat' and 'vmstat' was changed, and 'iostat' had a faulty column id)
- OS Monitoring: CmOsMpstat - Added column 'TotalPct (usr + sys + iowait)'
- OS Monitoring: CmOsIostat - Added column 'totalIoPerSec' just readsPerSec+writesPerSec. and 'readPct', 'writePct' which just is a percent calculation of totalIoPerSec
- OS Monitoring: New CmOsPs OS Top Processes(ps) - snapshot top processes on the Server side. Solaris, Aix, Hp: `not yet implemented`, Linux: `ps -e -ww --format pid,ppid,euser,tty,vsz,rss,etimes,cputime,pmem,pcpu,args --sort=-pcpu | head -n ##`, for Windows `powershell "Get-Process | sort -desc cpu | select -first ##"`
- on OutOfMemory: clear MovingAverage counters
- PersistWriterToHttpJson: Added the ability to send specific Counter MOdels at a finer grain (for example so we can send: CmActiveStatements)
- DictCompression - Not storing records as a batch, instead reverting back to single statement, also changed some concurrency issues
- Prepared for some H2 upgrade. ver 2.0.202 or above: JDBC MetaData getTables() new table type 'TABLE' --> 'BASE TABLE'
- H2 Central DB Copy was a bit adapted to be able to handle migration from older H2 versions (1.4) into H2 (2.1), this is mostly implemented in H2CentralDbCopy3
- PersistWriterToHttpJson: Now writes Counter Data for 'CmActiveStatements' (to support sending/viewig Active SQL Statements in the WebUI
- Changed PCS column 'CmNewDiffRateRow' to 'CmRowState', which now is a bit state field
- Added the ability for a CM to add an Aggregated row (SUM or AVG)
- Aggregated rows will be highlighted in GUI using a "light blue" background
- On AlarmEventOsLoadAverage added charts for "Adjusted Load Average"
- Created a Chart Data History Manager, to hold some chart's in memory, so we later can use/attach, them to various alarms. Each CM will have to enable what charts that needs such history
- Made a note in the cmdline switch help that H2 is the only supported database for the moment.
- The ability to have a "SUM/AVG/MIN/MAX" row at the end of any CM (each CM needs to declare the behaviour, if it's neede; what column etc...)
  Note: Aggregated rows will be discarded from CM methods like: getMaxValue(), getMinValue(), getSumValue(), getCountGtZero(), getAvgValue()
- Source DBMS data type translation. Each CM can implement modifyResultSetMetaData() to change data type (this was implented due to Postgres in some cases returned Precision and Scale with 0 values (it probably ment use "max" value, which is hard to translate into "other" DBMS when storing data in a PCS). Now there is a way to handle this. Either use SQL CAST or if not desirable, use this method to set Precision and Scale)
- PCS: Data Type Resolver -- Prints Warnings if Precision and Scale are 0 for NUMERIC and DECIMAL datatypes. (also if Precision is 0 for other columns)
- OsHostMonitoring (for all DbxTune Collectors)
  - CmOsDiskSpace -- AlarmEventLowOsDiskFreeSpace -- Available-MB -- now contains a history chart
  - CmOsDiskSpace -- AlarmEventLowOsDiskFreeSpace -- UsedPct -- now contains a history chart
  - CmOsIostat -- AlarmEventOsDiskUtilPct -- utilPct -- now contains a history chart
  - SshConnection -- You can enable a bit more logging with property: `SshConnection.logging.enable`
- Daily Summary Report Changes
  - Changed a bunch of things :)
  - Reports split in 2. One short version (which will be the main content for mails), and one long version (it will be attached in mails)
  - A new layout using bootstrap look and feel
  - All DbxTune Collectors: new section: iostat overview
  - Many of the statistical values now also has a "sparkline" (a mini chart) to represent *when* the measurement happened in time (was it during evening, night, morning or spread over the whole day)
  - New section (at the end) that shows DbxTune Collectors Errors and Warnings... Used to check for problems/issues/bugs with the collector (without having to read the error log).
  - For Windows: do not skip Host Monitoring information
  - Mail Sender - if the attached HTML file is to big, ZIP the file. (default is ZIP if above 10MB)
  - Mail Sender - If the attachment is larger than 30MB, do not attach, only send the small mail report.
  - Added section in "Recording Info": 1: If the HostMonitoring is enabled. 2: Hostname for the HostMonitoring. 3: If HostMonitoring is NOT Enabled, then write some info about how to enable it., and if it's Windows... Print some extra information about how to install SSH Server etc.
  - Charts (for HTML Page is now using, ChartJS, which means we can hide some labels, get tool tip etc), The images are still keps as a fallback for mail content or other readers that do not have JavaScript access.
  - New section at the end: Tracing how long the various sections took to produce. (more or less debugging)
  - Highligtning (in bold) what culumns we are sorting on (when the report was created)
  - new section to track how long time each Report Section takes
  - The GUI Version can now create a report on the current recording
  - Added section to see how large the PCS Tables are (mostly used by me for debugging)
  - Recording Information -- Added line "Recording Start Day" so we can easely see what DAY this report reflects (not just the date)
  - Changed some formating for sparkline (in Microsoft Outlook Version ### doesnt to a good job with rendering/layout of small images...)
  - The HTML Report -- Sections can now be collapsed
  - The HTML Report -- Chart.JS and Sparkline initialization can now be stopped with a button.
  - Mail Sender -- Of failure -- Try to send a "simpler" mail about the issue
  - If mail send fail, try to send another mail with NO attachment (but only if Eception looks like a 'message file too big'
- Upgraded some of the third party libraries/jars
  - To version 2.1.214 Component: H2 Database
  - To version 1.5.1 Component: JfreeChart
  - To version 4.5 Component: JSqlParser
  - To version 21.1 Component: Oracle JDBC Driver
  - To version 11.2.1 Component: Microsoft JDBC Driver
  - To version 9.4.38 Component: Jetty Embedded WebServer
  - To version ASE 16 SP4 Component: jConnect: jconn42.jar (which has JDBC 4.2 implementation)
  - To version ASE 16 SP4 Component: jConnect: jconn4.jar (keeping this since ddlgen,jar uses it... hopefully this wont collide with jconn42.jar, if it does simply remove jconn4.jar)
  - To version 8.0.25 Component: mysql-connector, JDBC Driver for MySQL
  - To version 263 Component: ganymed ssh2
  - To version 1.17 Component: simplemagic

### DbxCentral - The central WEB console to view Trend Graphs

- admin page -- added Daily Summary Report - Skip entry: overview and dialog
- Create a Daily Summary Report directly from the Web Interface (a link in the "offline" table + shows a dialog where you can specifiy a time range within that recording)
- Daily Summary Report - Directly from the Report, click a link that will open "admin page" and fill in: Daily Summary Report - SKIP Entries (or exclude some SQL Statements from reports)
- User Defined Content (http://dbxcentral:8080/overview#ud-content) - The ability to create a User Defined Chart or Report that connects to your bussines data and produce some output (initially made to draw a "gantt/timeline" of "work" that was done during the night jobs
- In the 'remove Server'. now stopping the collector if it's running. (note: a Timeout of 1 minute, without wait feedback)
- On graphs, added right click menu item: Open this graph (last 7 days, full day) in new Tab
- In the tab 'Server', and section 'All file(s) in the LOG Directory', added a shortcut section where you can add file endings that you want to list here. `logfiles.shortcuts=*.console`
- Changed number of lines in file tail from 500 to 5000
- changed default retention time from 12 months to 14 months (so we can see any "end-of-year" statistics)
- server view, added link to open ALL console files in tail mode
- index page: Only one button per server, which is now a drop-down box where you can choose: Various Actions
- Layout on the index page can also be controlled with "Grouping" and "Labels". in file '~/.dbxtune/dbxc/conf/SERVER_LIST'. Example: '#FORMAT; GROUP; Production Servers;' or '#FORMAT; LABEL; Some Sub-level text'
- Refresh of DbxTune collectors via the Web Interface (this is primary for refresh of Active SQL Statements)
- When reading graphs; Series that are empty (only nulls within the search period) will not be displayed. (This can be overridden with property: `CentralPersistReader.getGraphData.removeSeriesWhenAllRowsAreNull=true|false)`

### AseTune - Sybase/SAP Adaptive Server Enterprise

- When recording a session: SQL Capture -- Rewritten; now picks up SQL Text/Plan in a better way
- On connect: if option 'enable metrics capture' is enabled at server level, then disable it at the monConnection level using 'set metrics_capture off'
- AsePlanViewer - Fill in 'execParameters' or 'compileParameters' in the SQL Text
- bugfix: Discard Msg 938 -- Database 'xxx' is unavailable. It is undergoing LOAD TRANSACTION. in createPcsHeaderInfo()
- Alarm on AlarmEvent: ConfigResourceIsLow, ProcedureCacheLowOnMemory, ConfigResourceIsUsedUp -- added a chart that shows what happened in the last hour
- Bugfix: CmSummary -- Fixed typo 'sum(DbxConnections)' to 'sum(Connections)'
- Bugfix: Configuration sanity check for 'dsync' and 'directio'. Only when it's a filesystem. (skipping RAW/BLOCK devices)
- Rewrote DbmsDdlResolverTds.dbmsVendorDataTypeResolverForSource() to better conform with the Sybase datatypes in ResultSetMetaData, which does NOT follow the "standard"
- For alarm AlarmEventClientErrorMsg, if error 1105 -- adding a table with all databases: DBName, DbSizeInMb, LogSizeInMb, LogSizeFreeInMb, LogSizeUsedInMb, LogSizeUsedPct, TransactionLogFull, DataSizeInMb, DataSizeFreeInMb, DataSizeUsedInMb, DataSizeUsedPct, DBOptions
- CmActiveStatements - tab: Active Statements
  - New column: 'SpidLockCount' -- How Many Locks does this SPID hold
  - New column: 'BlockedSpidsInfo' -- If This SPID blocks other spid's, then this column include information about the SPID's that we are blocking.
  - New column: 'HasBlockedSpidsInfo' -- true or false, based on the above column.
  - New column: 'SrvUserName' -- Name of the Server Login. SQL: SrvUserName = suser_name(P.ServerUserID) Note: Only in ASE 15.0.2 ESD#2 or later
  - Added skip capabilities for alarm BlockingLockAlarm, you can skip on columns 'Command', 'Application', 'SrvUserName', and 'HostName'. The default is to skip where Command = `^(DUMP DATABASE|DUMP TRANSACTION).*`
  - raise AlarmEventLongRunningStatement when a statement has been executed for more than 3 hours (by default), 'skip' can be done on: dbname, Application, SrvUserName, HostName, Command
  - AlarmEventBlockingLockAlarm now also contains SPID, so we can report multiple blocking locks
  - Possible to filter out rows that hasnt been holding locks for more than X seconds (property: `CmActiveStatements.sample.holdingLocks.gt.SecondsWaiting=##`)
- CmCachedProcs - tab: Cached Procedures
  - Turned off sampling of StatementCache and DynamicSql object (this can be enabled again with: `CmCachedProcs.sample.statementCacheObjects=true` and `CmCachedProcs.sample.dynamicSqlObjects=true`
    So by default only "procedures" are visible here. This was made due to "amount of data" and that Daily Summary Report will only show Procedures.
    Dynamic SQL and Statement Cache can be view in the Statement Cache Collector (with much more details)
- CmCachedProcsSum - tab: Cached Procedures Sum
  - Turned off sampling of StatementCache and DynamicSql object (this can be enabled again with: `CmCachedProcsSum.sample.statementCacheObjects=true` and `CmCachedProcsSum.sample.dynamicSqlObjects=true`
    So by default only "procedures" are visible here. This was made due to "amount of data" and that Daily Summary Report will only show Procedures.
    Dynamic SQL and Statement Cache can be view in the Statement Cache Collector (with much more details)
- CmDataCaches - tab: Caches
  - bug fix: 'PhysicalReads' + 'APFReads' sometimes caused arithmic overflow. Converted data type to bigint before adding them
- CmDeviceIo - tab: Devices
  - 3 new Graph: Number of Disk Operations, for ALL Devices (Read+Write, Read, Write)
- CmEngines - tab: Engines
  - AlarmEventHighCpuUtilization now contains a history chart
- CmErrorLog
  - for AlarmEventErrorLogEntry also send a description of the error number
  - Alarm: Added error number 1621 to the SkipList
  - Added 'AlarmEventProcessStackTrace' and 'AlarmEventProcessTimeSliceError'. Note: only 'StackTrace' will be kept at the en (but for now I overlap the alarms until properly tested)
  - AlarmEventConfigResourceIsUsedUp -- number of user connections -- now contains a history chart
  - AlarmEventFullTranLog -- now contains a history chart
- CmObjectActivity - tab: Objects
  - Changed default postpone time to 10 minutes
- CmOpenDatabases - tab: Databases
  - bug fix: LowDbFreeSpaceInMb and LowLogFreeSpaceInMb sometimes didn't fire correctly
  - for AlarmEventLongRunningTransaction, added filters on 'OldestTranProg', 'OldestTranUser', 'OldestTranHost' so we can filter out known users or programs
  - Added HTML Table with all info to the alarms: AlarmEventLastBackupFailed, AlarmEventOldBackup, AlarmEventOldTranLogBackup
  - New columns 'DBOptions', 'status*' and 'minLogMode' all to support DBOptions
  - New alarm: AlarmEventDatabaseOption when above 'DBOptions' is changed.
  - AlarmEventFullTranLog -- now contains a history chart
  - AlarmEventLowDbFreeSpace -- now contains a history chart
  - AlarmEventLowLogFreeSpace -- LowLogFreeSpaceInMb -- now contains a history chart
  - AlarmEventLowDbFreeSpace -- LowDbFreeSpaceInPct -- now contains a history chart
  - AlarmEventLowLogFreeSpace -- LowLogFreeSpaceInPct -- now contains a history chart
- CmPCacheModuleUsage - tab: Proc Cache Module Usage
  - AlarmEventStatementCacheAboveConfig -- StatementCacheUsage -- now contains a history chart
- CmProcessActivity - tab: Processes
  - added column 'ClientDriverName' (for versions above ASE 16.0)
  - raise AlarmEventLongRunningStatement when a statement has been executed for more than 3 hours (by default), 'skip' can be done on: dbname, login, cmd and tranName
- CmSqlStatement - tab: SQL Statements
  - New column: 'errorMsgCountMap' -- A JSON String, which contains {MsgNumber={DBName=count}} example: {"1105":{"db1":5}}
  - New column: 'inProcNameNullCount' -- diff calculated: Estimated SQL Statements requests executed where ProcedureId was not 0, but the ProcedureName could NOT be found
  - New column: 'inProcNameNullCountAbs' -- absolute values: Estimated SQL Statements requests executed where ProcedureId was not 0, but the ProcedureName could NOT be found
  - changed default for CmSqlStatement.alarm.system.if.errorCount.gt from 10 to 20
  - Bugfix - fixed null pointer exception in error number mapping count
  - AlarmEventClientErrorMsgRate -- errorCount -- now contains a history chart
  - AlarmEventClientErrorMsg -- error=1105 -- now contains a history chart
- CmSqlStatementPerDb - tab: SQL Statements/DB
  - New Performance Counter, to check what databases that has the most calls and CPU, Logical/Physical usage.
    NOTE: This requires use to make a recording, since we depends on the SQL Capture subsystem
- CmStatementCache - tab: Statement Cache
  - Bugfix for CacheHitPct which was based on Absolute values instead of DIFF values, this lead to no or incorrect alarm AlarmEventConfigResourceIsLow(..."statement cache size"...)
  - AlarmEventConfigResourceIsLow -- statement cache size -- now contains a history chart
- CmStmntCacheDetails - tab: Statement Cache Details
  - added columns 'TotalEstWaitTime' and 'TotalEstWaitTimeDiff' -- Total Estimated Wait Time... Algorithm: TotalElapsedTime - TotalCpuTime
- CmSummary - tab: Summary
  - AlarmEventHighCpuUtilization -- TotalCPUTime -- now contains a history chart
  - AlarmEventHighCpuUtilization -- UserCPUTime -- now contains a history chart
  - AlarmEventHighCpuUtilization -- IoCPUTime -- now contains a history chart
- CmSysLoad - tab: System Load
  - AlarmEventRunQueueLength -- RunQueueLengthAvg1min -- now contains a history chart
  - AlarmEventRunQueueLength -- RunQueueLengthAvg5min -- now contains a history chart
  - AlarmEventRunQueueLength -- RunQueueLengthAvg15min -- now contains a history chart
- SQL Capture
  - Get XML Plan, now has it's own connection, since it sometimes collided with the SQL Capture connection, which caused the Capture thread to freeze
  - now also tries to capture "active SPID's" every second (and potentially) wait statistics on those... which will be visible in the Daily Reports
  - also the internal storage table(s) column layout was redone
  - Normalizations of SQL Statements was made better, and also a "rewrite" functionality was made so we can better support SQL Syntax "not supported" by JsqlParser
  - Statement Normalizer enhanced to handle Stored Procedure execution a bit better
  - XmlPlanCache -- getMemoryConsumption(): wrapped integer, changed to long for better info messages
  - XmlPlanCache -- lowOnMemoryHandler(): removes entries that hasn't been accessed for 1 hour (config: `XmlPlanCache.lowOnMememory.removeAgeInMinutes=60`)
  - DDL Storage, new option if you want to do 'sp_depends' at all. 'PersistentCounterHandler.ddl.doSpDepends=true'
  - When parsing/normalizing the SQL text, also extract Table names, and send them of to DDL Storage
  - DDL Lookup: extract SQL Text from XML Plan, extract table names and send those to DDL Storage
  - DDL Lookup: If DDL Stored object are views... extract table names and send those to DDL Storage
  - DDL Lookup: Extract trigger dependencies even if the full dependant 'sp_depends' option is enabled.
  - Now also aggregate counters on a database level to support the new CM: CmSqlStatementPerDb
- Daily Report
  - new: AseWaitStats -- Wait Statistics for the full day (origin: CmSysWaits / monSysWaits)
  - new: AseCmSqlStatement -- SQL Statement Execution Statistics (origin: CmSqlStatement / monSysStatement)
  - new: AseTopSlowNormalizedSql -- Top [SQL Captured] SLOW Normalized SQL Statements (order by: sumCpuTime, origin: monSysStatement)
  - new: AseTopSlowDynAndStmnt -- Top [SQL Captured] SLOW DynamicSQL and StatementCache Calls (order by: sumCpuTime, origin: monSysStatement)
  - new: AseTopSlowNormalizedSqlWaits -- Top [SQL Captured] - WaitTime - SLOW Normalized SQL Statements
  - new: AseTopCmObjectActivityLockWaits -- Top TABLE/INDEX Blocking Lock Wait Statistics
  - new: AseCmDeviceIo -- Device IO, (order by: Name, origin: CmDeviceIo_diff / monDeviceIO)
  - new: AseUnusedIndexes -- Top Unused Indexes, ordered by 'RowsInsUpdDel' (origin: CmObjectActivity)
  - Added one sections for Statement Cache Details, to show top "wait" statements
  - change in 'error info', only show first 100 SQL Statements for each error number
  - Copy the XML Plan in 'Top Statement Cache Entries'
  - SQL Captured - Slow Normalized -- More miniCharts/Sparklines also a "summary" section for every table, where important info is placed
  - Statement Cache -- More miniCharts/Sparklines also a "summary" section for every table, where important info is placed
  - Object Activity -- More miniCharts/Sparklines also a "summary" section for every table, where important info is placed
  - Recording Information -- Now also contains ASE: PageSize, SortOrder, Charset, LicenseInfo
  - Added a "summary" table for most active SQL Statements: with sparklines, SQL Text and Table information (Table and Index Sizes etc)
  - For table information VIEW added: 'DDL Definition'
  - For table information TABLE added: 'Created', 'Sample Time', 'DDL Info', 'Triggers DDL'
  - For table information INDEX/DATA added: 'RowsInserted', 'RowsUpdated', 'RowsDeleted', 'LogicalReads', 'PhysicalReads', 'APFReads', 'LockWaits', 'SharedLockWaitTime', 'ExclusiveLockWaitTime', 'UpdateLockWaitTime'.
  - Added section AseCmSqlStatementPerDb -- SQL Statement Execution Statistics per Database (origin: CmSqlStatementPerDb / monSysStatement)

### IqTune - Sybase/SAP IQ (The Column Storage Database)

- Setting AutoCommit=false at the end of a sample, and AutoCommit=true during sampling data.

### RsTune - Sybase/SAP Replication Server

- New Alarm: AlarmEventRsMissingLogicalConnection, which is raised when any logical connection is dropped (or not part of the configured list)
  config 'CmWsRepLatency.alarm.system.MandatoryLogicalConnections.list', which can be:
  - ALL to remember any existing logical connections on the server. and if any are dropped, the alarms will be raised.
  - or a Comma separated list with mandatory servers, for example: LSRV.db1, LSRV.db2, LSRV.db3
- New Alarm: AlarmEventRsInMemoryControl -- If any module is in Memory Control. column 'Object(State)' contains '.*(Ctrl)', send 'AlarmEventRsInMemoryControl'.
- CmAdminStatsBacklog - Removed DBID:qType in graphs so when connections are re-created we do not get a new chart line
- CmAdminWhoDist - Removed DBID:qType in graphs so when connections are re-created we do not get a new chart line
- CmAdminWhoDsi - Removed DBID:qType in graphs so when connections are re-created we do not get a new chart line
- CmAdminWhoSqm - Removed DBID:qType in graphs so when connections are re-created we do not get a new chart line
- CmAdminWhoSqt - Removed DBID:qType in graphs so when connections are re-created we do not get a new chart line
- CmRsMemory - RS 16.0 was using new name postfix (norm) in the key column
- CmWsRepLatency - Fixed some bugs (with "" empty logical database names)
- CmAdminDiskSpace - fix in "usedPct" calculation, which is just a info number sent as the alarm
- CmWsRepLatency - bugfix: if B srv was down, sometimes we sent alarm RsMissingLogicalConnection (hoefully this is solved now)
- CmAdminDiskSpace - AlarmEventRsSdUsage -- SpaceUsedSegs -- now contains a history chart
- CmAdminDiskSpace - AlarmEventRsSdUsage -- SpaceFreeSegs -- now contains a history chart
- CmAdminDiskSpace - AlarmEventRsSdUsage -- SpaceUsedPct -- now contains a history chart
- CmDbQueueSizeInRssd - AlarmEventRsDbQueueSize -- size -- now contains a history chart

### RaxTune - Sybase/SAP Replication Agent X

- No changes, please request some if you want this tool to evolve

### HanaTune - SAP HANA

- No changes, please request some if you want this tool to evolve

### OracleTune - Oracle Database

- new: CmExecutionTime - Execution times for individual Oracle Modules using 'V$SYS_TIME_MODEL'
- new: CmSqlStats - shows Oracle SQL Exec/CPU/BUFFER_GETS Statistics using 'V$SQLSTATS'
- PCS: Changed how the JDBC data type information was interpreted, some INTEGER was changed into BIGINT (this is only valid if you are recording data)
- Setting AutoCommit=false at the end of a sample, and AutoCommit=true during sampling data.

### SqlServerTune - Microsoft SQL-Server

- First step of monitor Azure SQL Database
- ConnectionDialog: Added default property values for: encrypt=true, trustServerCertificate=true (since the new MS JDBC driver now by default are using "wire" encryption)
- Added Alarm: AlarmEventDacInUse -- If someone is using te DAC (Dedicated Admin Connection) which normally should be used in emergency cases
- Added Alarm: AlarmEventQueryStoreLowFreeSpace -- If querey Store Space starts to get low
- Added Alarm: AlarmEventQueryStoreUnexpectedState -- If Query Store 'state' is not the expected/desired state
- Added Alarm: AlarmEventPerfCounter -- may be used for all PerfCounter Alarms (the Severity is passed by the CM depending on what it think is appropriate)
- Added Alarm: AlarmEventTempdbSpidUsage -- When a SPID uses a lot of tempdb space
- Added Alarm: AlarmEventDbSizeChanged -- When database gets bigger, we want a INFO alarm about this!
- Added Alarm: AlarmEventCertificateExpiry -- If any server certificates is about to expire
- Added CM: CmIndexMissing - Take information from 'dm_db_missing_index_*' and display them, in a prioritized way... NOTE: as always take the recommendations with 'a grain of salt'
- Added CM: CmIndexUnused - Unused Indexes - ordered by 'user_updates desc' so the undex with most updates will be "first"
- Added CM: CmTableSize - A cheaper version of 'CmIndexPhysical using dm_db_index_physical_stats', this one is using dm_db_partition_stats and is *much* cheaper...
- Added CM: CmMemoryClerks - Information about the memory clerks
- Added CM: CmMemoryGrants - Information about SPID's that requests memory grants
- Added CM: CmActiveStPlanStats - Active Stmnts Plan Stat -- get info about execution plan operators, to check what's taking most time in a execution plan. NOTE: This is in beta mode, and may be discarded
- Added CM: CmVersionStore - How much is the Version Storage Used per Database in tempdb
- Spaces in dbname - bugfix: when database names contains spaces. now they are quoted with square brackets. example: [my db name].sys.some_table_name
- DBMS Configuration - Also get linked servers using 'exec sp_linkedservers'
- DBMS Configuration - Added check to check if 'instant file initialization' is enabled at the OS Level
- DBMS Configuration - Added tab "SysMasterFiles" to see ALL files the SQL Server is using (CmDatabase only shows first file for each database)
- DBMS Configuration - Added capture for Resource Governor
- DBMS Configuration - Added new checks/issues for 'optimize for ad hoc workloads', 'max server memory (MB)', 'remote admin connections', 'cost threshold for parallelism'
- DBMS Configuration - Added tab for tempdb. Also with checking issues for 'temdb files < cores', 'datafiles_equal_size', 'datafiles_equal_grow_size'
- DBMS Configuration - Added SuspectPages, so we can get this in a "static" way also. Also DbmsConfigIssue if *anything* was found (to detect older/existing SuspectPages errors)
- DBMS Configuration - Added SqlServerCertificates, to view what certificates the SQL Server has
- DBMS Configuration - Added SqlServerAgentJobs, to view some info about SQL Agent Jobs
- CmActiveStatements - For blocking locks (marked as red background) - only the root blocker(s) are marked. logic (ImBlockingOtherSessionIds!="" and ImBlockedBySessionId=0)
- CmActiveStatements - added column 'dop - Degree Of Parallelism' if version is above 2016
- CmActiveStatements - added column 'LiveQueryPlan' and 'HasLiveQueryplan', and an option 'Get Live Query Plan'. It's populated if version 1016, SP1 or above
- CmActiveStatements - new column 'HasSpidLocks', 'SpidLocks' to collect what locks SPID's are holding
- CmActiveStatements - new column 'SpidLocks' to summarize how many locks a SPID holds
- CmActiveStatements - new column 'HasBlockedSpidsInfo', 'BlockedSpidsInfo' so that alarms can see both the root-cause-spid and the victim-spid information
- CmActiveStatements - new column 'ProcName', 'StmntStart' so we can see if a Stored Proc is executing (and not just the SQL Text)
- CmActiveStatements - Query Plans: get actual execution plans if the server supports it (2019 & traceflag 2451 or Database Scoped Configuration LAST_QUERY_PLAN_STATS)
- CmActiveStatements - new columns: 'TempdbUsageMb', 'is_user_process', 'percent_complete', 'estimated_completion_time'
- CmActiveStatements - new option 'Sample System SPID's'
- CmActiveStatements - using OUTER apply instead of CROSS apply to *not* miss records with no query or query plan
- CmActiveStatements - new alarm: if 'TempdbUsageMb' is above 16GB then send alarm: AlarmEventExtensiveUsage
- CmActiveStatements - Changed the 'BLOCKER' to only return Parent SPID's in parallel statements
- CmActiveStatements - Also sampling SPID's that are 'holding locks' but are not active on server, and control are at 'client side'
- CmActiveStatements - bugfix: Only report 'root cause' session_id's on blocking locks
- CmActiveStatements - AlarmEventBlockingLockAlarm now also contains SPID, so we can report multiple blocking locks
- CmActiveStatements - raise alarm 'AlarmEventHoldingLocksWhileWaitForClientInput' when a SPID has been holding locks at DBMS but not issuing any new commands from the client side.
- CmActiveStatements - New Columns 'TempdbUsageMbUser', 'TempdbUsageMbInternal', which is a "break up" of 'TempdbUsageMb', which is now calculated in a different way (values fetched in CmSummary and used in other "various" places)
- CmActiveStatements - New Columns 'estimated_finish_time', which is an estimate of 'estimated_completion_time'
- CmActiveStatements - new column 'tran_name' to easier track if this is an "implicit" or a "normal" transaction
- CmActiveStatements - alarm HoldingLocksWhileWaitForClientInput, new option to only send alarm if it hold exclusive locks (CmActiveStatements.alarm.system.if.HoldingLocksWhileWaitForClientInputInSec.exclusiveLocksOnly=true|false) default=true
- CmAlwaysOn - Granting select,insert,update,delete on table 'sqlserverTune_ag_dummy_update' was enhanced (note: this will still fail if the connection do not have authorization to create the table in the database.
- CmAlwaysOn - Added some debug info, when remote queries goes "bad"
- CmAlwaysOn - Using temp tables for intermidiate storage of tables instead of the join (this to see if it performs better)
- CmAlwaysOn - Added 2 graphs: LogSendQueueSizeKb, SecCommitLagTime, since we had alarms on them it made sense to also add Graphs
- CmDatabases - Added 'OldestTranName' and 'OldestTranId' - Now shows the transaction name and id (watch out for OldestTranName 'implicit_transaction', which indicates that AotoCommit is FALSE, which introduces more blocking locks)
- CmDatabases - fixed bug: LowDbFreeSpaceInMb and LowLogFreeSpaceInMb sometimes didn't fire correctly
- CmDatabases - Query Plans: get actual execution plans if the server supports it (2019 & traceflag 2451 or Database Scoped Configuration LAST_QUERY_PLAN_STATS)
- CmDatabases - new columns for Query Store: 'QsIsEnabled', 'QsIsOk', 'QsDesiredState', 'QsActualState', 'QsMaxSizeInMb', 'QsUsedSpaceInMb', 'QsFreeSpaceInMb', 'QsUsedPct', 'QsReadOnlyReason'
- CmDatabases - new column 'OldestTranHasLocks', 'OldestTranLocks' to collect what locks Oldest Transaction are holding
- CmDatabases - for AlarmEventLongRunningTransaction, added filters on 'OldestTranProg', 'OldestTranUser', 'OldestTranHost' so we can filter out known users or programs
- CmDatabases - Added HTML Table with all info to the alarms: AlarmEventLastBackupFailed, AlarmEventOldBackup, AlarmEventOldTranLogBackup
- CmDatabases - AlarmEventLowOsDiskFreeSpace fixed bug that did not display the correct 'mountPoint' ... it always said '-unknown-'
- CmDatabases - Do not raise LongRunningTransaction if we do NOT have any locks
- CmDatabases - new columns: 'LogFileCount', 'DataFileCount', 'OldestTranTempdbUsageMb'
- CmDatabases - new columns: 'LastGoodCheckDbTime', 'LastGoodCheckDbDays' to reflect what we have executed a DBCC CHECKDB. NOte: Only in 2016 SP2 and later.
- CmDatabases - raise AlarmEventDbccCheckdbAge when dbcc checkdb hasn't been executed. Default is 99999 (Basically turned OFF)
- CmDatabases - Added columns 'DbSizeInMbDiff' , 'DataSizeInMbDiff' and 'LogSizeInMbDiff' so we can easier see database growth and send alarm: AlarmEventDbSizeChanged
- CmDatabases - column 'OldestTranTempdbUsageMb' is replaced with 'OldestTranTempdbUsageMbAll', 'OldestTranTempdbUsageMbUser' and 'OldestTranTempdbUsageMbInternal', and fetched from CmSummary new TempdbUsagePerSpid sub system.
- CmDatabases - AlarmEventLowDbFreeSpace -- LowDbFreeSpaceInMb -- now contains a history chart
- CmDatabases - AlarmEventLowLogFreeSpace -- LowLogFreeSpaceInMb -- now contains a history chart
- CmDatabases - AlarmEventLowDbFreeSpace -- LowDbFreeSpaceInPct -- now contains a history chart
- CmDatabases - AlarmEventLowLogFreeSpace -- LowLogFreeSpaceInPct -- now contains a history chart
- CmDatabases - AlarmEventLowOsDiskFreeSpace -- LowOsDiskFreeSpaceInMb -- now contains a history chart
- CmDatabases - AlarmEventLowOsDiskFreeSpace -- LowOsDiskFreeSpaceInPct -- now contains a history chart
- CmDatabases - AlarmEventQueryStoreLowFreeSpace -- QsUsedSpaceInPct -- now contains a history chart
- CmDatabases - AlarmEventQueryStoreLowFreeSpace -- QsFreeSpaceInMb -- now contains a history chart
- CmDatabases - AlarmEventDbSizeChanged -- DbSizeInMbDiff -- now contains a history chart
- CmDeviceIo - 3 new Graph: Number of Disk Operations, for ALL Devices (Read+Write, Read, Write)
- CmErrorlog - Alarm: for 'LongIoRequests': Changed from Severity WARNING to INFO
- CmErrorlog - Alarm: Added error number 17810, 17832, 17836 to the SkipList
- CmErrorlog - Alarm: if we find a 'StackDump' collect all rows and send it as a Alarm
- CmExecCursors - new columns 'exec_sql_text', 'full_sql_text', to see what the cursor looks like. Also 'dbid', 'objectid' (which for the moment may not be trusted, since the origon from dm_exec_sql_text)
- CmExecCursors - using OUTER apply instead of CROSS apply to *not* miss records with no query or query plan
- CmExecQueryStat - new columns 'objectid', 'object_name'. so we can see if it's a procedure call
- CmExecQueryStat - Long running statements was sometimes missing, if 'sample_lastXminutes' was enabled.
- CmExecQueryStat - using OUTER apply instead of CROSS apply to *not* miss records with no query or query plan
- CmExecQueryStat - Changed Default 'postpone time' to 10 minutes... sample this less often
- CmExecQueryStat - Added columns 'PlanSizeKB', 'cacheobjtype', 'objtype'
- CmIndexOpStat - new postpone value of 300 seconds (5 minutes)
- CmIndexOpStat - using the DbmsObjectIdCache to lookup database_id->DbName, object_id->(TableName, SchemaName), index_id->IndexName
- CmIndexPhysical - using the DbmsObjectIdCache to lookup database_id->DbName, object_id->(TableName, SchemaName), index_id->IndexName
- CmIndexUnused - Added column 'CreateStatement' so that it will be easier to create documentation for "undo" actions
- CmIndexUsage - new postpone value of 300 seconds (5 minutes)
- CmIndexUsage - using the DbmsObjectIdCache to lookup database_id->DbName, object_id->(TableName, SchemaName), index_id->IndexName
- CmMemoryClearks - Added columns 'name', 'virtual_memory_reserved_MB', 'virtual_memory_committed_MB', 'awe_allocated_MB', 'shared_memory_reserved_MB', 'shared_memory_committed_MB'.
- CmMemoryClearks - Added graph 'Top 10 Memory Clerks, in MB'
- CmMemoryClearks - Added local "tab" pie chart, how the memory is distributed between the modules
- CmMemoryClearks - Changed calculation of 'SizeMb' added 'virtual_memory_committed_kb' and 'awe_allocated_kb'
- CmMemoryClearks - Added graph 'All Memory Clerks vs Target & Total Memory, in MB'
- CmMemoryGrants - using OUTER apply instead of CROSS apply to *not* miss records with no query or query plan
- CmOpenTransactions - Removed Primary Key & Query Plans: get actual execution plans if the server supports it (2019 & traceflag 2451 or Database Scoped Configuration LAST_QUERY_PLAN_STATS)
- CmOpenTransactions - Now also gets what locks the OpenTransactions is holding.
- CmOpenTransactions - using OUTER apply instead of CROSS apply to *not* miss records with no query or query plan
- CmOsLatch - added columns 'waiting_requests_count_diff', 'wait_time_ms_diff' to make it easier to see both ABS and DIFF value when in 'diff' mode
- CmPerfCounters - new graph 'Buffer Cache Data Size in MB'
- CmPerfCounters - new graph 'Target vs Total Memory'
- CmPerfCounters - new alarm: 'FreeListStalls' - Buffer Cache is probably to small... Waiting for memory to become available before a page can be added into the buffer pool. Alarm if 'FreeListStalls' is above 0.5 for 2 minutes
- CmPerfCounters - new alarm: if 'LazyWrites' is above 20 for 3 minutes
- CmPerfCounters - added graph 'Memory Manager', with a line for every entry where object_name is ':Memory Manager'
- CmPerfCounters - Added 5 graphs for Query Store Usage. 'QsTotal', 'QsDbCpu', 'QsDbPhysRead', 'QsDbLogiRead', 'QsDbLogiWrite'
- CmPerfCounters - Alarm: for 'Lazy writes/sec': Changed from Severity WARNING to INFO
- CmPlanCacheHistory - New collector: To check how old entries in the Plan Cache are (can we trust the values or is the Plan cache "stable")
- CmSchedulers - added 'diff' calculations for columns 'total_cpu_usage_ms', 'total_cpu_idle_capped_ms' and 'total_scheduler_delay_ms'
- CmSchedulers - New Graph: CPU Usage in Percent, ALL Schedulers (using dm_os_schedulers.total_cpu_usage_ms)
- CmSchedulers - New Graph: CPU Usage in Percent, per Scheduler (using dm_os_schedulers.total_cpu_usage_ms)
- CmSchedulers - New Graph: CPU Delay in Milisec, per Scheduler (using dm_os_schedulers.total_scheduler_delay_ms)
- CmSchedulers - New Graph: CPU Delay in Milisec, ALL Schedulers (using dm_os_schedulers.total_scheduler_delay_ms)
- CmSchedulers - Tooltip for columns: total_cpu_usage_ms, total_cpu_idle_capped_ms, total_scheduler_delay_ms, ideal_workers_limit, pdw_node_id
- CmSessions - Added column 'BlockingOtherSpids' - This holds information about what SPID(s) I'm currently blocking. Root blocker(s) are marked in red. logic (BlockingOtherSpids!="" and blocking_session_id=0)
- CmSessions - Added column 'tat_transaction_id', 'transaction_type', 'transaction_name' , 'transaction_begin_time' (watch out for transaction_name 'implicit_transaction', which indicates that AotoCommit is FALSE, which introduces more blocking locks)
- CmSessions - added column 'mars_count' to check how many MARS entries a connection are using.
- CmSessions - added column 'ExecTimeInMs' and raise AlarmEventLongRunningStatement when a statement has been executed for more than 3 hours (by defualt), 'skip' can be done on: dbname, login, cmd and tranName
- CmSessions - changed 'transaction_isolation_level' from a number to a string description (with the number appended)
- CmSessions - bug fix: when connections are using MARS, summarize all connection counters 'num_reads' and 'num_writes' for MARS sessions.
- CmSessions - new column 'ProcName', 'StmntStart' so we can see if a Stored Proc is executing and what "line"
- CmSessions - new column 'endpoint_type' so we can see what type of coonection it's using (DAC, SHARED_MEMORY, NAMED_PIPES, TCP, VIA)
- CmSessions - skip alarm 'LongRunningStatement' if column 'executing_managed_code' is true, and 'wait_type' is 'SLEEP_TASK'
- CmSessions - added columns 'tran_age_ms', and a few other columns for completion time and elaped time
- CmSessions - Columns 'tmp_user_objects_alloc_mb', 'tmp_user_objects_dealloc_mb', 'tmp_user_objects_deferred_dealloc_mb', 'tmp_internal_objects_alloc_mb' and 'tmp_internal_objects_dealloc_mb'. Are now DIFF Calculated.
- CmSessions - Columns 'tmp_user_objects_now_mb' and 'tmp_internal_objects_now_mb' are renamed to 'tmp_user_objects_used_mb' and 'tmp_internal_objects_used_mb'.
- CmSessions - Columns 'tmp_*' columns are now fetched from CmSummary new TempdbUsagePerSpid sub system.
- CmSpidWait - added column 'WaitClass', which tries to group 'wait_type' in groups ... this according to https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-query-store-wait-stats-transact-sql?view=sql-server-ver15
- CmSummary - Changed how to detect 'oldestOpenTranInSec' -- now only checks for "write" transactions
- CmSummary - Added column 'oldestOpenTranDbname' to see in what database the oldest tran is originating from
- CmSummary - Added option 'CmSummary.oldestOpenTran.discard.tempdb' to NOT alarm on old transactions in tempdb
- CmSummary - new columns: some new columns for oldestOpenTran***
- CmSummary - Skip alarm 'LongRunningTransaction' properies oldestOpenTran(LoginName|Cmd|Name|WaitType)
- CmSummary - now monitors the table 'msdb.dbo.suspect_pages' for suspect pages, and sends AlarmEventSuspectPages is any are found. (This can be disabled by property: `CmSummary.suspectPageCount.enabled=false`, `CmSummary.alarm.system.if.suspectPageCount.gt=###`)
- CmSummary - Column 'tempdbUsageMbAll', 'tempdbUsageMbUser' and 'tempdbUsageMbInternal' are now DIFF calculated.
- CmSummary - new graph -- Tempdb Usage by SPID's in MB -- with 3 series: 'All', 'User Objects', 'Internal Objects'
- CmSummary - now gets tempdb usage, which is used by various other CM's (This can be disabled by property: `CmSummary.sample.tempdb.spid.usage=false`)
- CmSummary - Added 3 graphs: TargetAndTotalMemMb, MemUtilizationPct, OsMemoryFreeMb
- CmSummary - Added som memory columns: total_os_memory_mb, available_physical_memory_mb, system_high_memory_signal_state, system_low_memory_signal_state, Total_Server_Memory_MB, Target_Server_Memory_MB, TargetVsTotal_diff_MB, memory_used_by_sqlserver_MB, locked_pages_used_by_sqlserver_MB, process_memory_utilization_pct, process_physical_memory_low, process_virtual_memory_low
- CmTableSize - using the DbmsObjectIdCache to lookup database_id->DbName, object_id->(TableName, SchemaName), index_id->IndexName
- CmTempdbSpidUsage - Completely rewritten, hopefully this one will work better
- CmTempdbUsage - added 2 new graphs 'Tempdb Usage by Object Type, in MB, {All|Subset}' -- Shows "Version Store", "Internal Objects", "User Objects", "Mixed Extents", "Allocated Space", "Free Space", "Total Space"
- CmTempdbUsage - better version handling (older versions of SQL-Server, then we skip more columns, not yet invented)
- CmTempdbUsage - new columns: to easier see what happening in MB
- CmWaitingTasks - new columns 'cpu_time', 'status', 'command', 'ProcName', 'StmntStart', 'program_name', 'database_id', 'database_name'
- CmWaitingTasks - Query Plans: get actual execution plans if the server supports it (2019 & traceflag 2451 or Database Scoped Configuration LAST_QUERY_PLAN_STATS)
- CmWaitingTasks - Added the following columns 'blocking_exec_context_id', 'blocking_task_address' for tracability
- CmWaitingTasks - Changed columns: 'currentSqlText', 'fullSqlBatchText', 'query_plan' only get SQL Text and Query Plan if 'exec_context_id' is 0, which is the "parent" for all worker threads
- CmWaitingTasks - new column 'resource_description_decoded', which tries to decode/enrich values in 'resource_description'. For example get DBName, SchemaName and ObjectName
- CmWaitingTasks - rewrote outer apply to be more 'in-line' and only grabbing the rows when needed (not for parallel workers, only for the parent SPID)
- CmWaitStats - added column 'WaitClass', which tries to group 'wait_type' in groups ... this according to https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-query-store-wait-stats-transact-sql?view=sql-server-ver15
- CmWaitStats - updated the list of 'wait_type' to skip (hopefully up to 2019)
- CmWho - Added column 'BlockingOtherSpids' - This holds information about what SPID(s) I'm currently blocking. Root blocker(s) are marked in red. logic (BlockingOtherSpids!="" and blocked=0)
- CmWho - added column 'dupMergeCount' to "merge" when we have duplicates which seems to happen when there are parrallel workers even if the PK is 'spid' and 'ecid'
- All (hopefully) CM's now have a "DB-Iterator" which get's system information from sys.objects, sys.schemas, sys.indexes... instead of using the built-in functions object_name(), object_schema_name() etc... Because the BIF will be blocked on many instances
- Tooltip changes: if any cell starts with '<ShowPlanXML xmlns=' show the special tooltip which offers to open the plan in various ways.
- Get SQL-Server configurations: to get active traceflags use 'DBCC TRACESTATUS(-1)' instead of 'DBCC TRACESTATUS'
- bug fix: to reset internal SQL-Server version number on disconnect.
- On Connect: Check for Recommended trace flags for different versions
  • SQL Server (between 2016 SP1 & 2019) traceflag 7412 -- to get "live query plans"
  • SQL-Server 2019, Actual-Query-Plans: traceflag 2451 or Database Scoped Configuration LAST_QUERY_PLAN_STATS
- PCS: Capture last day (or more) for databases that has Query Store enabled.
  • config: `SqlServerTune.onPcsDatabaseRollover.captureQueryStore = true|false` (if you want to change this)
  • config: `SqlServerTune.onPcsDatabaseRollover.captureQueryStore.daysToCopy = #` (if you want to change how many days)
  • config: `SqlServerTune.onPcsDatabaseRollover.captureQueryStore.skipServer = regex` (if you want to skip some servers)
- Set session level option 'set timeout 3000' on the monitoring connection (that is if we are blocked, dont wait for more thatn 3 seconds)
  • config: `SqlServerTune.onRefresh.setLockTimeout = true|false` (if you want to change this)
  • config: `SqlServerTune.onRefresh.setLockTimeout.ms = ms` (if change the timeout value)
- toHtmlTableString now also checks for '<ShowPlanXML xmlns=' and wraps that with a 'xmp' html-tag
- DbmsObjectIdCache - subsystem to cache ObjectID's to ObjectNames
- DbmsObjectIdCache - is pupulated at startup (this can be disabled with property: `SqlServerTune.objectIdCahe.bulkLoadOnStart=false`)
- html-query-plan: upgraded to version 2.6.1
- Changed how to detect if the SQL-Server is a 'Azure Synapse Analytics' or 'Parallel Data Warehouse'. now using: select ServerProperty('EngineEdition')
- Tooltip and Alarm with ShowPlanXML content... show a simplified plan with a Unordered List (that is indented to show children)
- all collectors had a SQL change. the Collector name is injected *after* the select statement (for easier identification when monitoring)
- DDL Lookup: extract SQL Text from XML Plan, extract table names and send those to DDL Storage
- DDL Lookup: If DDL Stored object are views... extract table names and send those to DDL Storage
- DDL Lookup: Extract trigger dependencies on inspected/saved tables
- DDL Lookup: If it's an execution plan. check for 'hasWarnings', 'hasImplicitConvertions', 'hasImplicitConvCardinality', 'hasKeyOrRidLookups', 'hasMissingIndexes', 'hasCursor', 'hasUserDefinedFunction'. Store those as a JSON in column 'object_text'
- DDL Lookup: For tables, extract save a bit more information about the tables, which is later on used by the Daily Summary Reports
- Added scheduler work to examen Query Store, to get top collected SQL Statement, parse them for table names and send them to the DDL Storage in the PCS (for later use by Daily Summary Reports)
- DDL extract in SqlServer removed 'OPTIMIZE_FOR_SEQUENTIAL_KEY', since it's only for SQL Server 2019 (might be added in at a later stage)
- ObjectLookupInspecor: added some [qutedIdentifiers] around dbname... to handle databases with spaces in them
- When showing a XML Showplan in a tooltip. Added option 'Open in Azure Data Studio'
- Daily Report
  - new: SqlServerWaitStats -- Wait Statistics for the full day (origin: CmWaitStat / dm_os_wait_stats)
  - new: SqlServerTopCmTableSize -- Top TABLE Size (order by: SizeInMb, origin: CmTableSize/dm_db_partition_stats)
  - new: SqlServerMissingIndexes -- Top Missing Indexes (origin: CmIndexMissing)
  - new: SqlServerUnusedIndexes -- Top Unused Indexes (origin: CmIndexUnused)
  - new: SqlServerCmDeviceIo -- DB File IO, (order by: database_id, file_id origin: CmDeviceIo_diff / dm_io_virtual_file_stats,master_files)
  - new: Procedure Executions
  - new: Function Executions
  - new: Trigger Executions
  - new: Cursor Executions
  - new: Table Access 4 reports: By Locks (simulate Logical Reads), By Waits, by Insert-Update-Delete, By Physical IO
  - new: Query Store for databases where it was enabled
  - Added 'download' XML Plan for 'Query Store' reports
  - new section: TopCmExecQueryStats sorted by: TEMPDB_SPILLS
  - new section: TopCmExecQueryStats sorted by: LOGICAL_READS
  - new section: TopCmExecQueryStats sorted by: LOGICAL_WRITES
  - new section: TopCmExecQueryStats sorted by: PHYSICAL_READS
  - new section: TopCmExecQueryStats sorted by: EXECUTION_COUNT
  - new section: TopCmExecQueryStats sorted by: MEMORY_GRANTS
  - new section: Plan Cache History
  - new section in Query Store: A Summary of ALL databases sorted by CPU also a section for every SQL, where important info/Sparklines is placed
  - Added a "summary" table for most active SQL Statements: with sparklines, SQL Text and Table information (Table and Index Sizes etc)
  - Wait Statistics: Added LCK_M_U, LCK_M_IX, PAGELATCH_SH, PAGELATCH_EX, RESOURCE_SEMAPHORE to the most common wait types
  - new section: DBMS Configuration Issues
  - new section: Estimated Wait Time, Only serial executions will be reflected here (since "estimated" is calculated by "elapsed_time - worker_time", which will be *faulty* in a parallel plan)
  - For table information VIEW added: 'DDL Definition'
  - For table information TABLE added: 'Created', 'Sample Time', 'DDL Info', 'Triggers DDL'
  - For table information INDEX added: 'Included Columns', 'Index Filters', 'READS', 'WRITES', 'page_latch_wait_count', 'page_latch_wait_in_ms', 'row_lock_count', 'row_lock_wait_count', 'row_lock_wait_in_ms', 'page_lock_count', 'page_lock_wait_count', 'page_lock_wait_in_ms', 'index_lock_promotion_attempt_count', 'index_lock_promotion_count'
  - Plan Cache History, added some columns (as information), like: 'PlanSizeKB', 'ObjType_Proc_Pct', 'ObjType_Prepared_Pct', 'ObjType_Adhoc_Pct', 'CacheObjType_CompiledPlan_Pct', 'CacheObjType_CompiledPlanStub_Pct', 'total_elapsed_time_ms', 'total_worker_time_ms', 'total_logical_reads', 'total_logical_writes', 'total_physical_reads', 'total_rows'.
  - CPU Usage Overview -- added MemoryClerksTop graph

### PostgresTune - PostgreSQL

- Implemented DDL Store... Or capture various information about tables etc, that later can be checked up (for example by the Daily Summary Report)
- onConnect, execute: set session work_mem = '128MB' Can be changed by config: PostgresTune.onMonConnect.set.dbms.option.work_mem=SOME_VALUE|DEFAULT
- onConnect, execute: set session temp_buffers = '128MB' Can be changed by config: PostgresTune.onMonConnect.set.dbms.option.temp_buffers=SOME_VALUE|DEFAULT
- Change how we collect current time from: CURRENT_TIMESTAMP to CLOCK_TIMESTAMP()
- Setting AutoCommit=false at the end of a sample, and AutoCommit=true during sampling data.
- Created a IP to Hostname cache, if we timeout on the lookup the cache is enabled for 10 minutes (property: `CounterControllerPostgres.ipToHostCache.ttl.ms=600000`)
- CmActiveStatements - new collector: CmActiveStatements, view SQL Statements that are active now
- CmPgArchiver - new collector: containing data about the archiver process of the cluster
- CmPgActivity - added column 'StatementExecInSec', and raise AlarmEventLongRunningStatement when a statement has been executed for more than 3 hours (by defualt), 'skip' can be done on: dbname, login, cmd and tranName
- CmPgActivity - added columns: 'im_blocked_by_pids' and 'im_blocking_other_pids'
- CmPgActivity - added columns: 'backend_start_age', 'xact_start_age', 'query_start_age', 'state_change_age' and 'xactTimeInMs'
- CmPgDatabase - Added graphs 'CacheHitPct' and 'TotalReads'
- CmPgDatabase - Added graph -- Rows Inserted, Updated and Deleted per second
- CmPgDatabase - AlarmEventConfigResourceIsLow -- free_connections -- now contains a history chart
- CmPgReplication - new collector: Check Replication
- CmPgSlru - new collector: Postgres accesses certain on-disk information via SLRU (simple least-recently-used) caches.
- CmPgStatements - Now works with Postgres 9.3 (and possibly versions below that), where I "fake" the 'queryid' by taking a md5 checksum (first 16 chars) and converting that to an bigint
- CmPgStatements - new columns for later versions (up to version 14)
- CmPgStatements - Parse SQL Text and send of tables for top ## statements to DDL Store
- CmPgStatementsSumDb - new collector: Statements by DB
- CmPgWal - new collector: containing data about WAL activity of the cluster, which has 3 graphs 'WAL Records per Second', 'WAL Writes per Second' and 'WAL Write Time in ms'
- CmPgLocks - new collector: All locks in the Postgres Instance. (from pg_locks), ObjectID's will be resolved using DbmsObjectIdCache
- CmSummary - added column 'in_recovery' to check if we connected to the ACTIVE or the STANDBY instance.
- CmSummary - added columns 'oldest_running_xact_age', 'oldest_prepared_xact_age', 'oldest_replication_slot_age', 'oldest_replica_xact_age' to check if we will exceed the MAX Transaction ID in some "near" future!
- CmSummary - Also a Graph on columns 'oldest_running_xact_age', 'oldest_prepared_xact_age', 'oldest_replication_slot_age', 'oldest_replica_xact_age'
- CmSummary - New graphs: 'Oldest Open Transaction in Seconds', 'Oldest Statement in Seconds', 'Oldest State in Seconds', 'Oldest Xact/Stmnt/State in Seconds', 'Blocking Locks Count' and 'Max Wait Time for Blocking Locks in Seconds'.
- CmSummary - New columns for Blocking Locks: 'blocking_lock_count', 'blocking_lock_wait_start' and 'blocking_lock_wait_in_sec'. (note: this can be disabled with property: `CmSummary.getBlockingLockCount=false`)
- CmSummary - New columns for Oldest Open Transaction (only displayed when we have one): Columns 'pid', 'state', 'dbname', 'appname', 'is_waiting', 'waiting_type', 'waiting_event', 'xact_start_in_sec', 'stmnt_start_in_sec', 'stmnt_last_exec_in_sec' , 'in_current_state_in_sec' , also _in_sec as '*_age'.
- CmSummary - sends Alarm: AlarmEventBlockingLockAlarm when 'blocking_lock_count' is above 0
- CmSummary - sends Alarm: AlarmEventLongRunningTransaction when 'oldest_xact_start_in_sec' is above 1800 seconds (30 minutes)
- CmSummary - sends Alarm: AlarmEventLongRunningTransaction when 'oldest_stmnt_start_in_sec' is above 10800 seconds (3 hours)
- CmPgTables - New chart 'DeadRows' so we can follow number of dead rows for each database
- CmPgTablesIo - Added columns 'cache_hit_pct', 'total_reads', 'all_blks_read', 'all_blks_hit'.
- CmPgTablesIo - Added graphs 'CacheHit' and 'CacheReads'
- CmPgStatementsSumDb - new collector: Statements by DB, with a bunch of graphs
- View Configuration - added one extra, calculated column: "ValueInMb"
- DDL Lookup/Store - Extract trigger dependencies on inspected/saved tables
- Daily Summary Report - Statements - tooltip and popup with the SQL Text
- Daily Summary Report - New section for 'DeadRows', also printing configuration that has to do with Autovacuum.
- Daily Summary Report - Top SQL -- More miniCharts/Sparklines also a "summary" section for every table, where important info is placed.
- Daily Summary Report - Added a "summary" table for most active SQL Statements: with sparklines, SQL Text and Table information (Table and Index Sizes etc)
- Daily Summary Report - Added new section - DBMS Configuration Issues
- Daily Summary Report - For table information VIEW added: 'DDL Definition'
- Daily Summary Report - For table information TABLE added: 'Sample Time', 'DDL Info', 'Triggers DDL'
- Daily Summary Report - For table information INDEX added: 'Included Columns'
- Daily Summary Report - PostgresStatementsPerDb to see at a database level
- Daily Summary Report - Added section PostgresLongRunningStmnts -- Long Running Statements Information (origin: CmSummary / pg_stat_activity)
- DBMS Configurations - Added sanity checks for 'synchronous_commit', 'shared_buffers', 'effective_cache_size', 'shared_preload_libraries', 'random_page_cost'

### MySqlTune - MySQL database

- Added CM: CmInnoDbMetrics - InnoDB Metrics
- Setting AutoCommit=false at the end of a sample, and AutoCommit=true during sampling data.

### Db2Tune - IBM DB2 LWU

- No changes, please request some if you want this tool to evolve

### SQL Window

- Sorting on Timestamp columns which includes NULL now works.
- The table filter now accepts negative values
- for SQL Server: in index lookups, added the INCLUDE(column list)
- bcp utility - for SQL Server, enable 'useBulkCopyForBatchInsert'
- chart utility - Added GANTT chart type in 'Create Graph Dialog', and also 'group by column'
- Added option 'rtrim' - to Right trim String values, previously we only had "full trim", which trimmed both left and right side of the string.
- AutoCompletion - Do not need a table alias for simple select, insert, update delete statements. Now you can simply do 'select <ctrl-space> from tabname where <ctrl-space>' to get columns that is part of the table...
- 'statistics io' summary table... for SQL-Server 2019 the output was changed (with more data/columns)
- Tooltip changes: if any cell starts with '<ShowPlanXML xmlns=' show the special tooltip which offers to open the plan in various ways.
- Refresh Code Completion: Ctrl + Shift + R
- Filter field can now be enabled or disabled with a checkbox
- for SQL-Server, the @@trancount warning was missing
- Connection dialog; option for 'Show Root Handlers', the + sign in the tree view
- new 'go foreachdb' to execute the command in every database (variable ${dbname} will be set, and can be used in the SQL Text)
- new 'go filter xxx' to fill in the "filter" text
- new 'go mrs' -- Merge ResultSets. Like a union, when you can't do union in SQL
- Better positioning for Postgres Error message. Postgres says 'Position: ###' where ### is offset in the text. So Translate the offset into Row/column so the "red snivle line" points out where the error is.
- Code Compleation. By default add Square Brackets instead of DBMS Specific chars, which later will be translated in the "correct" char for that DBMS Type upon execution (this can be changed in the Code Completion Settings Dialog)
- Postgres: Check for open transaction (and we are holding locks), then write a Watermark text 'You are in a TRANSACTION...'
- Tooltip on cells: Extended check for "if JSON"
- During connect, when 'Getting DBS Information' takes more than 100ms, show a popup informing what we are doing) instead of just blocking -- This is mainly for Postgres resolving IP into a hostname, which takes time if reversed DNS lookup isn't enabled.
- for Postgres: Status information -- Also display if we are in 'Recovery Mode'
- for Postgres: Added some new templates: 'Get hostname, port and Postgres Version String', 'Get what Extentions are installed' and 'Reload Postgres Configuration and pg_hba.conf file'.
- Tooltip to show data types in TableHeaders, slightly rewrite, to conform with: DbmsDdlResolverTds
- in the tool 'ddlgen' added options '-o|--outputFile' and '-O|--overwrite'
- Strip Java code to be SQL (reverse of 'Generate Java Code for selected text')

### Log Tail Tool

- No changes, please request some if you want this tool to evolve

## 2020-07-01

### Generic - Changes that affects all DbxTune tools

- Improved startup time...
- Now java 1.8 is needed
- Alarms
  - New: AlarmWriterToSlack -- Send messages to Slack
  - new: AlarmEventConfigResourceIsLow -- When DBMS is low on configured resources
  - new: AlarmEventConfigResourceIsUsedUp -- When DBMS is out off configured resources
  - new: AlarmEventErrorLogEntry -- When some defined error messages is written to the DBMS Error log
  - new: AlarmEventOldTranLogBackup -- OldBackup previously hold both DB and LOG. Now they are separated.
  - new: AlarmEventConfigChanges -- Fires when a configuration changes is detected from the error log
  - new: AlarmEventProcessInfected -- Fires if we find 'Process Infected' is found in the error log, this so we can easily see the stack trace.
  - new: AlarmEventLowOsDiskFreeSpace -- For SQL-Server, when we starting to run out of disk in the volumes where we store data/log files.
  - new: AlarmEventAseLicensExpiration -- For Sybase ASE; If the server is in Grace Period, send alarm.
  - new: AlarmEventMissingMandatoryContent -- which is used to check that some users or applications are logged in to the DBMS
  - new: AlarmEventOsDiskUtilPct -- if OS Disk has been busy for for a long time (something strange is happening, like write cache has been disabled due to low voltage on battery)
  - new: AlarmEventDatabaseState -- used for SQL-Server AlwaysOn
  - new: AlarmEventAgLogSendQueueSize -- used for SQL-Server AlwaysOn
  - new: AlarmEventAgRoleChange -- used for SQL-Server AlwaysOn
  - new: AlarmEventAgSecondaryCommitTimeLag -- used for SQL-Server AlwaysOn
  - new: AlarmEventAgSplitBrain -- used for SQL-Server AlwaysOn
  - new: AlarmEventAgUnexpectedState -- used for SQL-Server AlwaysOn
  - new: AlarmEventBagRolePercentSkewed -- used for SQL-Server AlwaysOn
  - Added Category: HADR and RPO (Recovery Point Objective)
  - Possible to send dummy alarm from the Template editor while editing the templates, to test any writer with the message template
  - possible to use `${activeAlarmCount}` in writer templates
  - possible to use `${dbxCentralUrl}` in writer templates
  - possible to use DbxTune `${Version}` information for example `${Version.getAppName()}`
  - possible to use Java `${System}` information for example `${System.getProperty("some.prop.name")}`
  Alarm Filter: new property '<AlarmWriterName>.filter.alwaysSendAlarmOnErrorsThatAffectsUpTime=*true*|false' with the description: Always Send Alarm On Errors That Affects UpTime. which is if the AlarmEvent has: Severity=ERROR and ServiceState=AFFECTED
- DBMS Config: now you can do 'difference check', with a UI where you can see any difference (You can check with another-dbms-instance or a saved-recording)
  This is a really nice feature to check for new config parameters in different releases, and also to check if someone has changed config since "any recording YYYY-MM-DD"
  You can also generate DDL - Data Definition Language to "change/sync" the configuration... (but PLEASE double check values before applying them), and for the moment this is only enabled for "Sybase ASE" and Oracle
- Daily Report: section was rewritten to be a more "modular".
- Daily Report: can be saved in a directory, so we can view the reports from DbxCentral Web Interface. properties 'DailySummaryReport.save=true|false', 'DailySummaryReport.remove.after.days=##', DailySummaryReport.save.dir=path, the files will be deleted after 60 days or (DailySummaryReport.remove.after.days=60)
- Daily Report: new Sender type 'NoOp' -- which enables us to "do not send anywhere", but instead just SAVE the HTML report
- Daily Report: also added many new sections and the ability to include a Chart/Graph image + links to Graphs in DbxCentral.
- Daily Report: Recoding Info Section: added 'DBMS Start Date' and 'How many days it has been running'
- Daily Report ASE: Tempdb Usage Size
- Daily Report Postgres: added section: 'Top 20 Table Accessed', 'Top 20 Table Sizes', 'print some basic config'
- Daily Report SQL-Server: added section: 'Database Sizes'
- H2 shutdown. Added "default" shutdown method. which is used any normal shutdown. (previously IMMEDIATELY was used, which didn't flush down some stuff to the H2 storage)
- in GUI Mode: when an Alarm is Raised, you will now get a popup (similar to when you have blocking locks, long transactions...)
- AlarmView Dialog - now also works in offline mode
- OS Host Monitoring - iostat: improved iostat number of columns parsing (in some cases the iostat version was unpredictable, for how many columns we would expect from iostat)
  Now I try to "count" number of columns returned at startup do: ioStatColCount=$(iostat -xdk | grep 'Device:' | wc -w); echo "ioStatColCount=${ioStatColCount}")
- OS Host Monitoring - DiskSpace: some systems printed long lines into 2 or several rows (added -P option to 'df')
- Sends Alarm if DbxCentral are down (default after 15 minutes)
- AlarmWriterToMail: small modification to get SSL/TSL (to live.com) to work
- Internal re-make of DBMS Quoted Identifier Characters. Source code SQL Statements should use [identifier].
  The Writers/Readers then translates the right/left brackets to use DBMS Specific chars: MySQL=`, mostOthers=", SQL-Server=[], SybaseASE=[], SqlAnywhere=[]
  The DBMS Specific char is fetched from the JDBC MetaData methods. and there is are methods with DbxConnection that ca "quotify" SQL Strings (which replaces the [] into correct chars)
- Host Monitoring: Negative Diff Counters did not work as expected
- CmOsDiskSpace: Now has 3 graphs (Space Used MB/Pct, Space Available MB) so we can follow space usage on a longer term basis (if sent to DbxCentral)
- CmOsDiskSpace: Better alarm handling (now all mount points are automatically checked, for PercentUsage=95% & LessThanMbLeft=10)
- ConnectionDialog changes
  - Remember SSH Key for OS Monitoring
  - Try to remember the state of Expanded/Collapsed trees (different tree-states are remembered for each tool)
  - Saving new entries "close" to the "source entry" in the tree-states
  - Cloning/Duplicating connection profiles (using right click menu)
  - Copy a profile name. (ctrl-c and/or right click menu to copy a profile name)
  - DDL Lookup: 'Database Object', 'Statement Cache' can individually be enabled/disabled
- Performance Counter Panels: added shortcut ctrl-1 = view ABS Counter, ctrl-2 = view DIFF Counters, ctrl-3 = view RATE Counters
- Tooltip on Cells in CounterModel - You can choose to see 'PK' or 'ALL' columns, you can also set if it should be a Focusable ToolTip (change settings with right click, context menu)
- View DBMS Configuration for all vendors: Changed most fields to be "editable", to make it easier to copy information from the cells
- PCS: Print statistics about H2 performance after a entry has been stored
- PCS: DDL Lookup, options to enable/disable Lokkup/Storage of 'Database Objects' and 'Statement Cache Entries' DDL
- PCS: H2 extra property "dbxtune.h2.url.extra" to add/override various H2 URL Properties
- PCS: New Persistent Counter Store -- InfluxDB (https://www.influxdata.com/) is a Time Series database that stores Trend Graphs for any DbxTune collector
- PCS: some work to make the PCS modules and DBMS Configuration more DBMS Vendor independent (create table data type, and Quoted Identifiers enhancements)
- PCS: Daily Reports are now done in background, with the previous period (prev day) database. When it's done, the shutdown defrag will be done.
- PCS: setting H2 option 'REUSE_SPACE=FALSE', which means that A LOT MORE disk space will be used for database storage (default is REUSE_SPACE=TRUE).
  But less CPU/IO will be done (due to 'DB garbage cleanup' is disabled).
  Note: this is a temporary workaround until H2 becomes better at this.
  The DB Size will be 'shrinked' (by shutdown defrag) by the 'CentralH2Defrag at 04:00', or when the collector does a database 'rollover' at midnight.
- Graph properties, for DbxCentral Web interface... so we can individually decide Graphs Label Sizes, yAxisScaleLabels (KB MB, GB, Seconds, etc...)
  This is described as a JSON object, example: {"yAxisScaleLabels":{"name":"mb","s0":" MB", "s1":" GB", "s2":" TB", "s3":" PB", "s4":" EB"}}
- CmIoStat: added chart 'iostat: Read & Write Operations(readsPerSec+writesPerSec) per Device & sec', which has 'readsPerSec' and 'writesPerSec' combined.
- All DbxTools does now have a Version Sensitive Information in the Counter Controller Property Dialog
- remove file produced by '-XX:HeapDumpPath=path' after 7 days, not to fill up disk space.
- NoGui: Changing configuration files will be automatically picked up (objects must read from the Configuration object to see the new values)
- collector 'CmOsIostat' which is part of all DbxTune collectors: send alarm 'AlarmEventOsDiskUtilPct' -- if OS Disk has been busy for for a long time (something strange is happening, like write cache has been disabled due to low voltage on battery)
- Trend Graph Panel - In the properties dialog, double click on a row, and it will move to the selected graph in the panel and "blink" it for 5 seconds, so it's easy to find graphs
- Host monitoring: iostat, now supports version 11.5.7, which intruduced/changed some columns
- Right click context menu: had some problems if the columns was re-ordered
- Introduced Dictionary Compression functionality (which basically is a normilization, a key/value storage with a md5/sha1/sha256 key so that we only store "common" strings *once* in the PCS (for some columns)... (see each xxxTune application for more info)
- Create 'User Defined Counter' Wizard: enhanced it to use JDBC dataypes for User Defined Graphs (for example in Postgres it wasn't possible to create User Defined graphs due to this)
- Upgraded some of the third party libraries/jars
  - To version 1.4.200 Component: H2 database
  - To version ASE 16 SP3,PL7 Component: jConnect, jTSD3, DDLGen, planviewer, dsparser
  - To version 3.0.0 Component: RSyntaxTextArea(3.0.2), RSTAUI, Autocomplete
  - To version 1.14 Component: simplemagic
  - To version 2.3.0 Component: juniversalchardet
  - To version 5.2 Component: Miglayout
  - To version 7.2.2 Component: Microsoft JDBC Driver
  - To version 262 Component: ganymed ssh2

### DbxCentral - The central WEB console to view Trend Graphs

- Axis Labels on graphs now has K/M/G/P for large values
- If we get errors when loading a graph/chart, don't stop, just continue with next.
- Minor layout changes of some html pages
- admin page: New section to change: System Supplied Graphs Profiles.
- new: Login Dialog (default admin password = IP Address on the machine where DbxCentral is running)
- new: Max size of the Historical recordings (this instead of just looking at how much space we got left)
  controlled by property: DataDirectoryCleaner.max.historical.space.usage.GB = ###, default = -1, which means disabled
- Graph Page - do hard refresh every 24 hour, so dashboards gets new javascript code every now and then
- Script files are now loaded from dbxcental's web service and not from various Internet places
- /api/healthcheck - Let other monitors check how all monitored servers are doing. Results as JSON
- Send Alarm if any of the Collectors has not sent any data for a while (default: 10*collectorSampleTime so 10 minutes if sample time is 30 seconds)
- First step into a Daily Summary Report, which is constructed by DbxCentral (a complement to the Collectors Daily Report)
- Added alternate parameters for a bunch of the 'api' url's for example 'srv', 'srvName' and 'sessionName' is the same (just different names)
- Better error handling for parameters in most 'api' url's (instead of throwing Exception, a "sendError()" is done)
- log file view has been improved, so that you can just press a button at the end of the page to start "tail"
- Added '<<' and '>>' to goto previous/next day, with same time period (see same # hour period, but prev/next day)
- Added Multi Day Chart 'mdc' option, for example to view CPU usage over X day... (simply add mdc=# to the URL), where # is number of days to view
  There are shortcuts for this when you right click a chart
  - Open this graph (last # days) in new Tab
  - Open ALL graphs in view (last # days) in new Tab
  - with mdcwd=1,2,3 (you can specify to only show some of the week days)
  - with mdcp=true|false (you can specify to layout in Pivot mode, just in what order the graphs are added to the layout)
- Viewing log files:
  - add title, so it's easier to see what file we are viewing
  - tail: Scroll to bottom when new rows is received did not work on Safari - tail: on enter in the fields '# rows' & 'filter text', automatically press 'reload' button
- Changed url to 'load offline session' in *tune applications (added IFEXISTS=TRUE;DB_CLOSE_ON_EXIT=FALSE)
- Changes in shutdown sequence. (wait for current entry to be saved before shutdown)
- Write some extra H2 statistics on every "persist".
- Graph page: the 'from - to'. Only show HH:mm if we are on current day, otherwise show YYYY--MM-DD HH:mm
- Graph page: Dark mode on available with parameter cs=dark (cs for Color Schema)
- Index Page: A Checkbox on main page to open the graphs in Dark mode
- Index Page: A Text box on main page where you can choose Number of Graph Columns (gcols=#)
- AlarmWriterToMail: Changed HTML Template to include some extra information on CANCEL (ReRaiseCount and last reRaiseDescription, reRaiseExtendedDescription)
- Added AlarmEventOsLoadAverage when the host where DbxCentral consumes to much CPU (especially in combination with H2)
- New section under 'Servers': All file(s) in the REPORTS Directory
- Print statistics about H2 performance after a entry has been stored
- Servers Overview; Daily Report Section: Added links to view "latest" daily report for each on the servers
- PCS central: Changed "CentralH2Defrag" to check once a day at 04:00 instead of every 4 hour
- The Remember "Alarm Window Max Size" and "Solid Background" between sessions (which is visible if there are Active Alarms)
- Changed ALARM_ACTIVE and ALARM_HISTORY: data type for columns 'data' and 'lastData' from varchar(160) to varchar(512)
- Under 'admin' you can now change content of a User Defined Profile (graphs to display, Description and URL Properties)
- Remova all active alarms for a server

### AseTune - Sybase/SAP Adaptive Server Enterprise

- Alarm on License grace period
- When a database recording "rolls over" into a new date, then reset some things like if CmOpenObjects has had timeout's, which may have disables 'TabRowCount', 'NumUsedPages', 'RowsPerPage' (so lets re-enable it)
- Dictionary Compression is introduced on the following Counter Collectors

- CmActiveStatements, column 'MonSqlText', 'DbccSqlText', 'ProcCallStack', 'ShowPlanText', 'DbccStacktrace', 'CachedPlanInXml', 'SpidLocks'.
- CmOpenDatabases column 'OldestTranSqlText', 'OldestTranShowPlanText', 'OldestTranLocks'.
- CmProcessActivity column 'SqlText'.
- CmQpMetrics column 'qtext'.
- CmSpidCpuWait column 'MonSqlText', 'DbccSqlText', 'ProcCallStack', 'ShowPlanText', 'DbccStacktrace'.
- CmStmntCacheDetails column 'sqltext', 'xmlPlan', 'msgAsColValue'.
- SqlCaptureBrokerAse column 'SQLText', 'NormSQLText'

- View Configuration
  - Added tab: Resource Governor, which does: sp_help_resource_limit
  - Changed tab: ShmDumpConfig, at the end: include Instructions for setting up shared memory dumps
- CmSummary
  - Added column 'Total (read+Write)', for the graph 'Disk read/write, Global Variables'.)
  - Added column 'Total (received+sent+errors)', for the graph 'Network Packets received/sent, Global Variables'.)
- CmProcessActivity - tab:Processes
  - Added column 'LocksHeld', for all ASE Versions, It was simply left out by misstake.)
  - Check for mandatory 'Application' and 'Login' - and send alarm 'MissingMandatoryContent' if so.
- CmObjectActivity - tab:Objects
  - include 'temp worktable' from monProcessObject, this so we can check if there are extensive Logical Reads on "work tables"
  - Added column 'UsageInKb'
    for 'temp worktable' (monProcessObject) it's column 'PartitionSize' from monProcessObject
    for all other (monOpenObjectActivity) it's: convert(int, data_pages(A.DBID, A.ObjectID, A.IndexID) * (@@maxpagesize/1024))
  - added column 'LrPerScan' to see how many LogicalReads that is used per Scan or per Operation/SQL-Statement
- CmDataCahces - Caches
  - send AlarmEventConfigResourceIsLow if 'default data cache' is < 10mb (8mb is the typical default configuration)
  - Added column 'RealPhysicalReads'... Actual or Real Physical Reads
    Formula: PhysicalReads + APFReads
  - Bugfix: 'CacheHitRate' which was faulty calculated. It now uses 'RealPhysicalReads' instead of 'PhysicalReads' to calculate the Hit Rate
- CmCahePools - tab:Pools
  - Added column 'RealPhysicalReads'... Actual or Real Physical Reads
    Formula: PhysicalReads + APFReads
  - Added column 'RealPagesRead'... Actual or Real Number of Pages read into the pool.
    For a 1 Page Pool, this is the same value as PagesRead.
    But for a 2, 4 or 8 Page Pool, the PagesRead is a bit misleading, yes it number of pages, but not Physical IO's read.
    To get Physical IO's read you need to divide by number of PagesPerIO in the Pool. (since we are reading X pages with One IO Operation)
    Formula: PagesRead / PagesPerIO
  - Bug at 'CacheHitRate' which was faulty calculated for MultiPagePools. It now uses 'RealPagesRead' instead of 'PagesRead' to calculate the Hit Rate
  - Added Graph: Cache Pools Real Physical Reads (Physical+APF)
- CmCachedProcs
  - Two new columns 'SSQLID' and 'Hashkey' extracted from the ObjectName if it starts with '*ss' or '*sq'
- CmSpidWaits
  - New graphs, One for each type: Waits, WaitTime, WaitTimePerWait on SPID and on CLASS
- CmSysWaits
  - New graphs, One for each type: Waits, WaitTime, WaitTimePerWait on SPID and on CLASS
- CmErrorLog
  - Send Alarm: `AlarmEventConfigResourceIsUsedUp` if ErrorNumber 1601 -- There are not enough 'user connections' available to start a new process
  - Send Alarm: `AlarmEventFullTranLog` if ErrorNumber 7413 -- # task(s) are sleeping waiting for space to become available in the log segment for database XXXXX.
  - Send Alarm: `AlarmEventErrorLogEntry` if Severity > 16 (coniguration `CmErrorLog.alarm.system.if.Severity.gt`)
  - In above severity check, we can skip/discard error messages we do not want alarms on.
    `CmErrorLog.alarm.system.errorNumber.skip.list=123,321,231` where the numers are a comma separeted list of error numbers to skip/discard.
  - Will now be saved to PCS when you record a session
- CmExecutionTime
  - added column: CpuUsagePct - How much Percent of ALL available CPU time does this category use
  - added column: EngineCount used in above calculation
  - added graph: ASE SubSystem Execution CPU Usage Percent
- Object/Access -> Active Statements - CmActiveStatements
  - added columns 'BlockingOthersMaxTimeInSec' -- Max Time in Seconds this SPID has been Blocking other SPID's from executing, because this SPID hold lock(s), that some other SPID wants to grab.
  - now also sends BlockingLockAlarm after 60 seconds
  - New option "Get SPID Locks" - What locks does this spid hold. (select "db,table,type,cnt" from syslocks where spid = ?)
- Server -> Engines - CmEngines
  - In graph values, set max value to 100%, (sometimes it was slightly above 100% which made the chart to change scale to 150% as the "max")
- CmDeadlock
  - Will now be saved to PCS when you record a session
- CmLockTimeout
  - Will now be saved to PCS when you record a session
- CmOpenDatabases
  - Option to disable SQL-Text and Showplan for open transactions.
    `CmOpenDatabases.sample.monSqltext=true`
    `CmOpenDatabases.sample.showplan`
  - New graph: DbDataSizeUsedMbGraph - DB Data Space used in MB
  - New graph: DbLogSizeUsedMbGraph - DB Transaction Log Space used in MB
  - Smaller changes the Alarm functionality for 'LastDbBackupAgeInHours' and 'LastLogBackupAgeInHours'
    - If 'BackupStartTime=NULL' or 'LastTranLogDumpTime=NULL' AND any of the keep* or skip* rules are available
    Then send alarm (AlarmEventOldBackup) when ASE has not yet made any backups
    This so we can easier trap if any backup jobs has *stopped* working *after* a ASE reboot
  - changed alarm 'AlarmEventOldBackup': This alarm was fired after a ASE Restart, due to dependencies of columns 'LastDbBackupAgeInHours' and 'LastLogBackupAgeInHours' in memory values is NULL after restart.
    Now we try to discard those faulty alarms by using the ASE Start time as the "LastBackupTime"...
  - New option "Locks" - What locks does the 'OldestTranSpid' hold. (select "db,table,type,cnt" from syslocks where spid = ?)
  - removed 'sybsecurity' from the "skip list", so we can better se if that gets full or not.
- CmMonitorConfig
  - Send alarm `AlarmEventConfigResourceIsLow` if "Pct_act" is lower than 90% for config 'number of open objects', 'number of open partitions', 'number of open indexes', 'number of open databases', 'number of locks', 'number of user connections'
  - Send alarm `AlarmEventConfigResourceIsUsedUp` if "Num_free" is lower than 2 for config 'number of open objects', 'number of open partitions', 'number of open indexes', 'number of open databases', 'number of locks', 'number of user connections'
- CmPCacheModuleUsage
  - Refresh cached ASE Configuration every hour (if statement cache has changed in size)
- CmStmntCacheDetails
  - added some columns (*Diff) so that it's easier in the diff/rate section to see Absolute values combined with some *Diff columns.
- CmStatementCache
  - Send alarm `AlarmEventConfigResourceIsLow` if "CacheHitPct" is lower than 25%, config option: CmStatementCache.alarm.system.if.CacheHitPct.lt=25
- NEW: CmSqlDynamic - 'Dynamic SQL'
  - can be used to check what client vendors are executing Prepared Statements
  - also try to figure out if the Prepared Statements are closed properly
- CmSqlStatement - 'SQL Statement'
  Added 7 new Graphs, to figure out what SQL Statements Over Response times/spans... and how much resources they take.
  - Sum Exec Time Over SQL Response Time
  - Sum Logical Reads Over SQL Response Time
  - Sum Physical Reads Over SQL Response Time
  - Sum CPU Time Over SQL Response Time
  - Sum Wait Time Over SQL Response Time
  - Sum Rows Affected Over SQL Response Time
  - Error Count
- CmProcElc - Engine Local Proc Cache
  - A new monitor table 'monProcELC' in ASE 16 SP3 PL8
- Host Monitor -> OS Load Average(uptime) - CmOsUptime
  - Bugfix: Uptime less than 1 our was unable to parse
- View DBMS Configuration
  - on startup check for various strange DBMS configuration(s)
    - 'default data cache' is at default configuration
    - disk devices that are configured with dsync=false and/or directio=false (except for device names that contains the string 'temp' or 'tmp')
    - sp_monitorconfig, if any of the records has 'numReuse' above 0
    - In GUI mode, a dialog will be displayed... where you can "disable the message, until next ASE restart"
    - In NO-GUI mode, simply print some Warning to the AseTune error log
  - Search dialog in the DBMS Config can now use "where" (SQL similar where clauses to search the config table)
- PCS - Recordings -- DDL Lookup and SQL Capture
  - DDL Lookup SQL Capture Connections will be checked every 5 minute (for open transaction, if it's not valid, close connection)
    `PersistentCounterHandler.ddl.connCheckPeriod=300000`
    `PersistentCounterHandler.sqlCapture.connCheckPeriod=300000`
- Daily Report
  - AseConfiguration - show all non-default configuration
  - AseSpMonitorConfig - Show last sampled: sp_monitorconfig 'all'
  - In Statement Cache: show how many 'Statement Cache' is configured.

### IqTune - Sybase/SAP IQ (The Column Storage Database)

- CmIqStatistics: fixed bug for DiskGraph, data and labels count was incorrect.

### RsTune - Sybase/SAP Replication Server

- CmAdminStatBacklog
  - Changed algorithm for what to show in trend graphs (from 'Max' to 'Obs' above 0)
- RsMemory
  - In 15.7.1 SP300 (i think) the column name 'Object/State' was changed to 'Object(State)'
- CounterSampleWsIterator
  - Changed exception handling to "exit late" instead of "early" (faster into a "normal" state after a ASE Reboot)

### RaxTune - Sybase/SAP Replication Agent X

- No changes, please request some if you want this tool to evolve

### HanaTune - SAP HANA

- No changes, please request some if you want this tool to evolve

### OracleTune - Oracle Database

- CmSessions
  - Check for mandatory 'PROGRAM', 'USERNAME' and 'OSUSER' - and send alarm 'MissingMandatoryContent' if so.

### SqlServerTune - Microsoft SQL-Server

- New Counter Collector: CmTempdbUsage - 'Tempdb Usage' - How much is used in the tempdb
- All Collectors: Identify if we are connected to SQL-Server on Azure or a "normal" SQL-Server
- All Collectors: DMV names that are different on Azure, so if we connects to Azure the SQL will automatically be fixed
- Implemented a Version Sensitive Information in the Counter Controller Property Dialog
- Collector: 'CmWaitingTasks' complete rewrite using 'Paul S. Randal, SQLskills.com' WaitingTasks.sql
- Collector: 'CmWaitingTasks' Do not fetch ALL SQL Text, only the test that is executing NOW (especially good if it's a Stored Proc that is running)
- Collector: 'CmWaitStats' Now excludes more 'wait_type' thanks to 'Paul S. Randal'
  - Also another way of exclude 'wait_types' by just clicking a checkbox in the JTable
  - Also a filter to discard a bunch of 'wait_types' in the SQL Statement directly (default to off)
  - Tooltip on 'wait_types' now also has a HTML link to descriptions made by 'Paul S. Randal'
- Collector: 'ExecQueryStat' -- Added a property to choose how many minutes we want to look back
- Tooltip: All Collectors that has 'session_id': Execute select * from sysprocesses and 'last know executed SQL Statement'.
- Tooltip: All Collectors that has 'query_plan': Option to click in the tooltip to: Open XML Showplan in external Browser
- New Collector: CmSpidWait - What wait types are SPID's waiting on... also 3 graphs on this.
- New Collector: CmDatabase - Database Sizes and usage, on both OS and SQL-Server level
- New Collector: CmOpenTransaction - List open transactions and there last SQL Statements, and Execution Plan (if still executing)
- New Collector: CmErrorLog - Sniff the SQL Server error log
- New Collector: CmAlwaysOn - AlwaysOn or Availability Groups
- New Collector: CmIndexPhysical
- Tooltip on a xml showplan, 'open in SqlSentry Plan Explorer'
- Configuration, store: select * from sys.dm_server_registry
- CmActiveStatements: added columns 'ImBlockingOthersMaxTimeInSec' -- Max Time in Seconds this session_id has been Blocking other session_id's from executing, because this session_id hold lock(s), that some other session_id wants to grab.
- CmActiveStatements: now also sends BlockingLockAlarm after 60 seconds
- CmDatabases: Added chart: 'Database Size in MB', since the databases can grow/shrink, it's nice to see when and how often it happens
- CmDatabases: Added column 'DataFileGroupCount' so we can track how many database files are used (for example in tempdb)
- CmDatabases: Also changed the SQL Statement to make it a bit more efficient (use less logical reads), it's still a bit to recourse consuming...
- CmWaitStats: Added chart "Server Wait, Known Top 10 that could cause issues, by 'wait_time_ms'" (LCK_M_X, LCK_M_U, WRITELOG, LCK_M_IX, LATCH_EX, ASYNC_NETWORK_IO, SOS_SCHEDULER_YIELD, PAGEIOLATCH_SH, LCK_M_S, CXPACKET)
- CmWaitStats: Added chart "Server Wait, Known Top 10 that could cause issues, by 'waiting_tasks_count'" (same as above list of wait types)
- CmWho - Check for mandatory 'program_name' and 'loginame' - and send alarm 'MissingMandatoryContent' if so.
- Dbms Config: Get active trace flags (and a description dictionary for some common SQL-Server trace flags)
- Dbms Config: Add DbmsConfigIssue Warning for databases that has a lower compatibility_level than the servers default value
- Dbms Config: SysDatabases - also print Database Scoped Configurations
- Daily Report: if 'LogSizeInMb' is larger than 'DataSizeInMb' and 'recovery_model_desc' is FULL, then mark the cell in RED
- Collector: 'PerfCounters': added some new graphs: FreeListStalls, MemoryGrantsPending, PlanCacheHitRate, PlanCacheMb, PlanCacheObjCnt, PlanCacheObjUse
- Removed CM: CmExecSessions (replaced by: CmSessions)
- Removed CM: CmExecRequests (replaced by: CmSessions)
- Added CM: CmQueryTransformStat -- Query optimization, what rules are used can be checked here
- Added CM: CmSessions -- Raplacing: CmExecSessions & CmExecRequests
- Added CM: CmWorkers -- See how workers are used and Degree of Paralell
- CmDatabases -- Rewrote the SQL to use #temp tables, and hopefully that will use less CPU
- CmIndexPhysical
  - Added pk with 'alloc_unit_type_desc', so we can track BLOB's
  - Postpone time was set to every 4 hour (yes capture, but not that often)
  - use sp_MSforeachdb to not check databases where we don't have access
- CmPerfCounters -- Added Graph 'TransWriteSec'
- PCS: some work on 'storing XML Execution Plans'
- Daily Summary Reports (added sections: Query Stats, TopTableSize, AvgPageUsedPct, and Graphs: OsCpuEffective, SqlBatch, TransWriteSec, SqlServerConfiguration)
- Changed to ToolTipProvider, it can now open a Execution Plan in SSMS
- CmWho: Shows Worker Threads (ecid - Execution Context ID)
- CmWho -- rearrenged column names a bit, also changed Primary Key to be 'spid', 'ecid'�. Worket threads(ecid!=0) are displayed in a Beige Color, also better at detecting "system spids"
- CmSessions -- this still needs *more* work... but it is now *just* showing for session_id's and *not* for parallel workers... Still needs to reorder columns etc to make it *usable*
- CmActiveStatements, duplicated 'cpu_time', 'reads', 'logical_reads', 'writes': into exec_* and sess_*
  where the exec_* columns represents entries from 'dm_exec_requests', which reflects what is executed *right* now
  where the sess_* columns represents entries from 'dm_exec_sessions', where those counters are omly updated *after* a statement execution has been completed
- Dictionary Compression is introduced on the following Counter Collectors

- CmActiveStatements column 'lastKnownSql', 'query_plan'.
- CmDatabases column 'OldestTranSqlText', 'OldestTranShowPlanText'.
- CmExecQueryStats column 'SqlText'.
- CmOpenTransactions column 'LastSqlText', 'LastPlan'.
- CmTempdbSpidUsage column 'LastQueryText'.
- CmWaitingTasks column 'currentSqlText', 'fullSqlBatchText', 'query_plan'.

### PostgresTune - PostgreSQL

- No need to have the initial connection pointing to the 'postgres' database for collectors that iterates over databases
- in DatabaseIterator only lookup the databases where we are authorized
- CmPgTableSize: do NOT include schema 'information_schema', 'pg_catalog', 'pg_toast'
- CmPgDatabase: New Columns 'tup_fetched_in_slide, tup_returned_in_slide, fetch_efficency_slide_pct' and a new graph 'Row Fetch Efficiency SLIDE'
  This is "the same as" graphs for 'Row Fetch Efficiency' and 'Row Fetch Efficiency ABS' but uses a 15 minute slide/range from which the Efficiency is calculated
- Added Collector for Function Stats
- Cell tooltip on 'ObjectName' on all collectors - now shows some information about the table (in online mode)
- Cell tooltip on 'plan_handle' on all collectors - now able to show a GUI ShowPlan in an external HTML Browser (by clicking on a link in the tooltip window)
- Added one "line" srv_cfg_max_connections, to the chart 'ConnectionsSum', so we can see how "close" we are to running out of connections
- Added alarm 'ConfigResourceIsLow' if we only have less than 25 connections free. (canged with property: CmPgDatabase.alarm.system.if.free_connections.lt=##)
- CmPgActivity - Check for mandatory 'application_name' and 'usename' - and send alarm 'MissingMandatoryContent' if so.
- Daily Reports, added: PostgresConfiguration - show all non-default configuration
- Dictionary Compression is introduced on the following Counter Collectors

- CmPgActivity column 'query'.
- CmPgStatements column 'query'.

### MySqlTune - MySQL database

- View DBMS Configuration, simple for now...
- CmSysSession - Check for mandatory 'program_name' and 'user' - and send alarm 'MissingMandatoryContent' if so.

### Db2Tune - IBM DB2 LWU

- bug fix: Connections to Linux was only possible (now "hopefully" accepting for more LUW platforms, all starting with "DB2/")
- Added: CmErrorLog
- Added: CmTableSpace and CmTableSpaceAll (one of them will probably be removed)

### SQL Window

- print EED Parameters for error messages (in ASE, some messages might have extra information attached to the message)
- added 'go tab' to display the output ResultSet(s) in JTabbedPane
- \prep reading clob, now tries to figure out the files encoding using UniversalDetector
- Reading ResultSet feedback (blocking popup UI: how many rows we have currently read)
  Below 100 rows, report each row.
  After that report every 100ms
- PipeCommandBcp - added -t for truncating a destination table
- Tooltip on cell, improved for CLOB/BLOB (Instead of displaying the content directly. Prompt if you want to open in external browser)
- new tools: Import, export, transfer data (not yet 100% completed)
- improved: \loadfile command
- new command 'go | graph' (or chart) to display a graph/chart of the ResultSet
- also right click on a ResultSet table, and choose 'Create Graph/Chart on Table Content...'
- improved 'go | bcp' to transfer data/ResultSet between different servers and DBMS Vendors (NOTE: Still not production stable)
- added 'go skiprs #' and 'go keeprs #' to discard and keep specific ResultSet (can for example be used with 'go | chart')
- Cell tooltip is a bit more configurable now (max size, display all columns, or just current, etc...)
- code completion: for command \rsql,\tabdiff,\dbdiff etc, if '-p' or '--profile' switch -- do: lookup any Connection Profile names
- code completion: for 'go' -- do: Lookup any parameters and pipe commands that are available for 'go'
- code completion: Code Completion like :db sv: :st :s :t :v now allows searching... If you type ':tadm' all tables starting with 'adm' will be displayed (it also accepts wild cards like ':t*admin' shows tables that has 'admin' somewhere in the table name)
- Show more information in the status bar for Postgres: Backend PID, Session User, Current User, Current Catalog, Current Schema
- Postgres: Show all available databases in the 'database combobox'.
  When a database is selected: a New connection is made to this database (the old connection is not closed, but put in a pool, if/when you switch back to that database)
- Changed \tabdiff to work better with Postgres. The Postgres JDBC Driver fetched ALL records into the client before continuing (implemented 'fetchSize')
- new Commands to do data content diff over servers (and possibly DBMS vendors):
  - go | diff ... -- Do difference on ResultSet
  - \tabdiff ... -- Do difference on a Table level
  - \dbdiff ... -- Do difference on a database level
- new \commands:
  - \rsql: to execute SQL at a remote DBMS (at any vendor)
  - \use: to switch between databases using the 'database combobox', mainly for DBMS's like Postgres or databases that do not allow cross database references (works with code completion)
  - \disconnect: Simply disconnect from current DBMS
  - \connect 'profile name': Connect to any Connection Profile, without having to Open the Connection Dialog (works with code completion)
    For the moment you need to execute this command as a separate SQL batch (so you can't have it in the middle of a SQL Batch, sorry...)
  - \ccr: Code Completion Refresh
  - \utf8len: Check UTF-8 Actual Length, check the actual UTF-8 length and compare it with the max length (ASE & SQL-Server has a max length of BYTES instead of chars)
- SQL Server: On errors Print information about Line Number, serverName, ProcName etc.
- SQL Server: Added 'Set' Button with 'statistics io', showplan, exec time
- replaceFakeQuotedIdentifiers: translate '[' and ']' into DBMS Specific Quoted Identifier Chars at runtime
  write 'select [c1] from [t1] where [c4] = 1' --translated-to--> 'select "c1" from "t1" where "c4" = 1' or whatever the DBMS specific char is.
- MySQL: Added DBMS Configuration
- Remove "C null termination chars" from any strings (which causes problems when copy text into the Copy/Paste buffer)
- A bit better guessing at DBMS data types (for Postgres=text, and SqlServer varchar(max))
- ResultSet Meta Data view. Right click menu option on ResultSetTable or the table header.
- Better handling of Extended Information in table tool tip (estimated row count, clustered index (ASE and MS SQL-Server))
- improved 'go' pipe command: go | bcp, new: switches --table, --dropTable, --crTable, --crIndex, --utf8Dest, --exec (dryrun is the default now)
- in AutoCommit=false, a field 'FetchSize' is added so you can specify the Statement.setFetchSize()
- new menu: File -> View -> Preferences -> ResultSet Table Properties... to set various Preferences for how the ResultSet Table will display data
- new Code Completion ':r' -- Code Completion Refresh
- ResultSet Tables: Show in-exact number a bit better (in the settings dialog you can choose how many decimals you want to show)
- Added keyboard shortcut for the User Defined Favorite Commands
- Code Completion now also picks up entries from the ToolTipProvider (which you can add entries to in the files under ${HOME}/resources/DBMSTYPE_tooltip_provider.xml)
- Better handling of decimal numbers (number of decimals)
- Editor: TSQL (Microsoft flavor) Syntax highlight
- Code Compleation: added ':TT' so we can bring up *just* the tooltip, which are added in a static file.
- The above tooltips are just showed in a normal code-compleation as a "last resort"

### Log Tail Tool

- No changes, please request some if you want this tool to evolve

## 2018-11-05

### Generic - Changes that affects all DbxTune tools

- Moved into one common configuration file: dbxtune.properties, instead of {product}tune.properties
  The user file is still individual for all different tools: {product}tune.user.properties
  The save file is still individual for all different tools: {product}tune.save.properties
- All CM tabs now also has a filter field where you can enter SQL syntax to filter what you want to se in the JTable
  This does NOT affect the SQL Statement issued to the server, it only filters in the local in-memory JTable
- Exception text are now stored in a recording so it can be displayed when we view the data later
- CM Dependencies has been improved: if we view a tab that depends on some else CM, the dependant CM will be refreshed...
- Warning popups on 'Full Translog', 'Oldest Open Tran', 'Lock Waits' will only popup on new occations (so we can dismiss them, and get a new popup next time we got problems)
- Alarm system has been implemeted (mainly for NO-GUI mode), where you can have AlarmWriters, which sends Alarms to various implementations.
  You can set Alarm Thresholds at: menu->View->Change Alarm Options... and in the Wizard 'Create record session - template file Wizard...'
  In the above dialog you can create "user defined alarm logic", which consists of java code that is compiled "on the fly" (so it's java as a script language)
  To view Active/Historical Alarm, menu->View->Alarm Active/History
  The following Alarm Writers has been created, the idea is to use them in 'NO-GUI' mode (but they will work in GUI mode as well)

  ToFile | Write Active alarms to one file, and the history to another log file.
  ToMail | Send a SMTP mail
  ToNagiosNsca | Send Alarms to Nagios via the NSCA protocoll
  ToNagiosRest | Send Alarms to Nagios via the REST protocoll
  ToRest | Send Alarms to a HTTP server using POST where payload will be a JSON object
  ToSmsViaSnpp | Send Alarms to a SMS/TEXT via SNPP Simple Network Paging Protocol
  ToStdout | Simply print the Alarms to Standbard OUT
  ToSunMcFile | Send Alarms to Sun Management Center, write as a text file with tags.
  ToSyslog | Send Alarms to Syslog server (narmally a Unix/Linux system logger)

  Below is a list of Alarms that currently available... But more will come...

  BlockingLockAlarm | Found Blocking locks in '${servername}'. Count=${cnt}.
  FullTranLog | Full transaction log in some database(s) in '${servername}'. Count=${cnt}.
  FullTranLog | Full transaction log in '${servername}', dbname='${dbname}'.
  HighCpuUtilization | High CPU Utilization in '${servername}'. CPU at ${totalCpuUsagePct}.
  HighCpuUtilization | High ${cpuType} Utilization in '${servername}'. CPU at ${totalCpuUsagePct} percent (total=${totalCpuUsagePct}%, user=${userCpuUsagePct}%, system=${systemCpuUsagePct}%, idle=${idleCpuUsagePct}%).
  LastBackupFailed | Last Backup FAILED in Server '${servername}' and dbname '${dbname}'.
  LongRunningDetachedTransaction | Found Long running transaction, with state 'Detached' in '${servername}', dbname='${dbname}'. Seconds=${seconds}, TranName='${tranName}'.
  LongRunningTransaction | Found Long running transaction in '${servername}'. Seconds=${sec}.
  LongRunningTransaction | Found Long running transaction in '${servername}', dbname='${dbname}'. Seconds=${sec}, TranName='${oldestTranName}'.
  LowDbFreeSpace | Low DB DATA Free Space in Server '${servername}' and dbname '${dbname}', FreeSpaceInMB=###, UsedSpaceInPcs=###.
  LowLogFreeSpace | Low LOG DATA Free Space in Server '${servername}' and dbname '${dbname}', FreeSpaceInMB=###, UsedSpaceInPcs=###.
  LowOsDiskFreeSpace | Low Operating System Disk Free Space in Server '${servername}' at MountPoint '${mountPoint}', FreeSpaceInMB=###, UsedSpaceInPcs=###.
  OldBackup | Old or No backup found in '${servername}', dbname='${dbname}', for backup type '${dumpType}', Backup Age in Hours '###'.
  OsLoadAverage | Exhausting CPU Scheduling resources at OperatingSystem level on hostname '${hostname}'. adjLoadAverage: 1min=${avg_1min}, 5min=${avg_5min}, 15min=${avg_15min}.
  ProcedureCacheLowOnMemory | Stored Procedure Cache Memory is getting low in server '${servername}'. FreeSpaceInMB=###, UsedSpaceInPcs=###.
  ProcedureCacheOutOfMemory | Out Of Stored Procedure Cache Memory in server '${servername}'.
  RunQueueLength | Exhausting CPU Scheduling resources in '${servername}'. RunQueueLength: avg_1min=${avg_1min}, avg_5min=${avg_5min}, avg_15min=${avg_15min}.
  SrvDown | Server is DOWN. Name='${servername}'
  SrvDown | Server is DOWN. Name='${servername}', url='${url}'
  StatementCacheAboveConfig | Statement Cache is above the configured value in server '${servername}'. configuredSpaceInMb=###, usedSpaceInMb=###, usedSpaceInPct=###, usedPercentOfProcedurMemory=###.

  Some alarms specific for RepServer: RsDbQueueSize, RsMemoryUsage, RsReplicationAge, RsSdUsage, RsWsState
- NO-GUI Mode: if no password has been specified for DBMS/SSH (-P, -p or in the config file), get the password from the file $HOME/.passwd.enc (which is encrypted passwords using opensll)
- NO-GUI Mode: You can specify a logname for each of the no-gui collector processes (if you have several on the same machine). Use -L logFileName
- SSH Key File improvements for all tools. Use: -k filename
- All Graphs now has '(TabName->CmName)' so it's easier to identify from where the information originates
- Memory settings setting dialog for 'Max Memory' and 'Garbage Collection'. In this dialog you can specify your own values.
- The "postpone" functionality can be temporaraly be enabled/disabled with a checkbox without changing the postpone time
- Host Monitoring: The os utilities can output different number of columns, in different versions of the utilities. Now it handles the different versions. Also better internationalization for numbers and time.
  On startup it will print the utility version.
- Tail of log files, now has filters that you can apply to discard some records (good for RepServer and other log files, which generates a lot of output)
- New Counter Collector, HostMonitoring: Memory Information, which gets information from /proc/meminfo
- Changing local home directory from '~/.asetune' to '~/.dbxtune'
- config and log files changed from '~/.asetune' to '~/.dbxtune/conf' and '~/.dbxtune/log'
- Some new command line switches: '-a|--createAppDir', '-A|--serverAlias', '-O|--urlOptions'... mainly for no-gui
- Connection Dialog: set/change the DBXTUNE_SAVE_DIR in the dialog
- Connection Dialog: button to create a new Profile
- Connection Dialog: Made number of items before scroll, in the JDBC Driver drop-down larger.
- DDL View: Added search field/dialog
- Better handling of 'SrvDown', send to DbxCentral
- Wizard: Create 'Record Session - template File'
  Added page: Send Daily Report, with a bunch of configuration options
- PCS: Persistent Counter Storage - Also writing Active Alarms to the Recording PCS Database
- PCS: You can specify 'PersistWriterJdbc.h2.shutdown.type=DEFRAG|COMPACT|IMMEDIATELY', where DEFRAG is default, and if you want to do that in a background thread 'PersistWriterJdbc.h2.shutdown.inBgThread=true|false', where 'true' is default.
- PCS: In no-gui mode, if the disk becomes full, then DbxTune will stop... since it can't save any data...
- PCS: Create a Daily Report and send... For the moment it will only send Current Active and All Alarms that has been generated during that day. In the future it might me more sophisticated, and try to figure out recommendations for various SQL Statements or DBMS Configurations.
- Probably a bunch of other stuff, which I can't remember...

### DbxCentral - The central WEB console to view Trend Graphs

- This is a total new functionality, and it's here where a lot off hours has been spent...
- See a preview of this at http://gorans.org:8080
  Please be gentle with the environment, it's only trying to give you a preview...
  The preview environment is currently having:
  4 - different versions of ASE (12.5.4, 15.5, 15.7 & 16.0)
  1 - SQL-Server 2017 (Running on Linux)
  1 - Postgres, Version 9.5
  1 - MySQL, Version 5.7
  Missing pieces are: RepServer,RAX, IQ, Oracle, DB2 & HANA
  Note 1: The ASE 15.5 version currently has a alarm/warning active to illustrate how alarms is displayed.
  Note 2: Nothing is really happening on any of the DBMS instances, so do not expect any fancy graph activity... It's just NO-GUI collectors sampling idle DBMS Instances
- All dbxTune collectors can now send the "trend graph" information to a Central Server, which can/will store the data for a longer time. The default retention period is 1 year.
- Trend Graphs can be viewed from "any" web browser, by "anyone" (except the old Microsoft Internet Explorer) This will enable developers to find potential performance problems while testing/developing.
- Trend graph updates are "pushed" from the web server to the browser via web sockets (so no need to refresh every x second)
- To view all details about a recording you will still have to use the "fat" GUI, the current GUI implementation (but you can remote-connect to the recorded database, which is stored on the DbxCentral host)
- If all collectors are also running on the same host as DbxCentral, it will also delete old recordings based on how much space we got left on the file system, and prediction of how much recording space we will need for next 2 days.
- Alarm information is also sent from the collectors to DbxCentral, so we can see if we are having active alarms for specific servers
- The Alarm information is also stored, so we can later on check what alarms we had, and for how long they were active
- This is in BETA mode for the moment, instructions for how to set this up is in a separate file... see README_dbxcentral_install.txt
  Please send feedback on this functionality when you test it or start to use it

### AseTune - Sybase/SAP Adaptive Server Enterprise

- Enhancement: Check for a "full transaction log" in CmSummary and CmOpenDatabases
- Tooltip: show PK column(s) and current cell value when hovering over a table cell (this can be enabled/disabled under the "local options" button)
- Tooltip: for cell content on columns 'ObjectName':
  - content starts with '*ss' or '*sq' show the XML Execution Plan in a special GUI - AsePlanView
  - content is a table: show extended information about the table (rowcount, data/index/LOB size, FK References etc.)
- When "refresh" a CM's show how long time we have used to refresh this tab in the watermark text (the timer is visible after 500ms or so)
- Trying to do a better job at error '2714 There is already an object named '#xxxxxxxxxx' in the database.'
  If we get this several times (drop do not work), try to do re-connect at next sample (mark the connection for re-connect)
- AsePlanView , has got one extra load option 'Load Name', which tries to load any '*ss####...' name from the XML Plan Cache
- Persitent Counter Store - Record a session
  - Record executed SQL Statement and SQL Text, with filters to store only if ExecutionTime, LogicalReads and PhysicalReads is greater than a specific value.
  - new Dialog where you can view SQL Statements and SQL Text saved by the Persistance Counter Store. (you can view ALL Statements or just ones within current sample in the timeline)
- Show DBMS Configuration, added Configuration History tab (for ASE 16)
- Show DBMS Configuration, changed from "isql" column layout to "sqlw" layout (more condensed)
- Show application name in the titlebar can be enabled or disabled. Under preferences.
- Configure monitoring Dialog, added 'nonpushdown pipe active', and 'show deferred compilation text'.
- Capture SQL when recording a session (and the below dialog to view Captured SQL - in offline mode)
- Added dialog so we can view 'Capture SQL, Offline view'.
- Summary -> Summary Panel - CmSummary
  - Changed the default value of 'CmSummary.sample.lockCount' from false to true
- Disk -> Devices - CmDeviceIo
  - local graphs added: 'Read/Write Pct' and 'Read/APF Pct'
- Cache -> Cached Objects - CmCachedObjects
  - PK extended to include 'OwnerUserID'
- Cache -> Statement Cache Details - CmStmntCacheDetails
  - added 'Remark' column, where 'SkewedExecPlan-Abs' and 'SkewedExecPlan-Diff' is described
- Server -> Processes - CmProcessActivity
  - Background color for Worker processes:
    - DARK BEIGE - SPID has Worker Processes Connected to it (Parent for a worker thread)
    - BEIGE - SPID is a Worker Processes
  - added columns: AvgBytesPerSentPacket, AvgBytesPerReceivedPacket
  - added column: in 16.0 SP2, sample SQL-Text using query_text(spid) if not in WaitEventID 250
  - added column: ClientRemotePort - pssinfo(SP.spid, 'ipport') to get the client port used to comunicate
- Server -> Sysmon Raw - CmSysmon
  - Now also prints Some spinlock contention values (for example, Cachlet and Procedure cache spinlocks)
- Object/Access -> Active Statements - CmActiveStatements
  - in ASE 16.0 SP2 PL5 and 15.7.0 SP138 the column 'PhysicalReads, LogicalReads, PagesModified' is bigint
  - in ASE 16.0 SP3 new column 'QueryOptimizationTime'
- Object/Access -> Objects - CmObjectActivity
  - in ASE 16.0 SP3 PL4 new columns: MaxInsRowsInXact, MaxDelRowsInXact, MaxUpdRowsInXact
- Object/Access -> SQL Statements - CmSqlStatement
  - New Collector: SQL Statement/Batch Activity - In what "time span" does most SQL Statements/Batches execute within, and how much resources do they consume.
  - Gets records from monSysStatement (from the AseTune - SQL Capture Broker subsystem)
  - Note: If you have a Stored Procedure based system, you will have a lot of extra 'cnt' incrementation, this since one row in monSysStatement is produced for every statement in a stored proc.
- Object/Access -> QP Metrics - CmQpMetrics
  - Added checkbox if we want to "flush" the statistics or not
- Server -> SPID Activity - CmSpidCpuWait
  - in ASE 16.0 SP3 new column 'QueryOptimizationTime'
- Server -> Databases - CmOpenDatabases
  - Show SQL Statement and QueryPlan for oldest open transaction
  - A better job trying to distinguage Data/UserDefined segments and Log segments
  - in ASE 15.7 SP136 & SP64 or above; use Function spaceusage(dbid) to track a bunch of new columns, which is good to track especially LOB (text/image) column growth
    RawSpaceUsage, ReservedMb, UsedMb, UnUsedMb, DataMb, DataMbReal, IndexMb, IndexMbReal, LobMb, ReservedPages, UsedPages, UnUsedPages, DataPages, DataPagesReal, IndexPages, IndexPagesReal, LobPages, Tables, RowCountSum, OamPages, AllocationUnits
  - new graph: TempdbUsedMbGraph - TempDB Space used in MB
- Cache -> Statement Cache - CmStatementCache
  - new columns: if ASE above 16.0 SP3 PL0
  - ProcedureCacheSizeKB = Capacity of the Procedure Cache (KB)
  - AQTCacheUsedSizeKB = Amount of cache in use for Auto Query Tuning (AQT) objects (KB)
  - NumAQTs = Number of AQT objects in the cache
- Host Monitor -> OS Disk Stat(iostat) - CmOsIostat
  - You can now map the device names got from iostat into your own label-name, or discard some devices...
  - Linux, add -N switch to iostat, if property 'CmOsIostat.linux.opt.N=true'. -N = Display the registered device mapper names for any device mapper devices
  - Discard some devices from the output. if property 'CmOsIostat.exclude.devices=true' and 'CmOsIostat.exclude.devices.regexp=someRegExp', someRegExp defaults to 'sd[a-z]'
- Host Monitor -> OS Load Average(uptime) - CmOsUptime
  - Added columns 'nproc', 'adjLoadAverage_1Min', 'adjLoadAverage_5Min', 'adjLoadAverage_15Min'
    where nproc is number of available processing units. and adjLoadAverage* is LoadAverage/nproc to average out the LoadAverage value to a more sensible value
- Object/Access -> Transactions - CmTransactions
  - This one is new
  - List current Transactions in the system - mostly to check if we have long running distributed transactions
- Host Monitor -> Network Stats - CmOsNwInfo
  - This one is new
  - Checks The Network activity from the OS
- Host Monitor -> OS Disk Space Usage(df) - CmOsDiskSpace
  - This one is new
  - Does 'df' on the OS, so we can check for full or near-full disk systems (more important for PostgresTune MySqlTune etc)
- New Graphs
  - CmCachePools
    - Cache Pools Hit Rate
    - Cache Pools Utilization
    - Cache Pools Used MB
    - Cache Pools Free MB
    - Cache Pools MRU Replacement
    - Cache Pools LRU fetch-and-discard Placement
    - Cache Pools Logical Reads
    - Cache Pools Physical Reads
    - Cache Pools APF Reads
    - Cache Pools APF Reads Percent
    - Cache Pools Replacement Slide
  - CmDataCache
    - Data Caches LogicalReads
    - Data Caches PhysicalReads
    - Data Caches ApfReads
    - Data Caches Writes
  - CmOpenDatabases
    - DB Data Space left in MB
    - DB Data Space used in PCT
  - CmSpMonitorConfig
    - Procedure Cache Usage in Percent
    - Procedure Cache Usage in MB
    - MetaData Cache Usage in Percent
    - MetaData Cache Active Count (number of: open objects, open index, open partitions, locks, sort buffers, user connections, worker processes)
  - CmPCacheModuleUsage
    - Procedure Cache Module Usage (in MB)
  - CmPCacheModuleUsage
    - Procedure Cache Module Usage (in MB)
  - CmProcessActivity
    - Tempdb Usage in MB, using pssinfo
  - CmRaLogActivity
    - RA LogScan Records Sum, per second
    - RA Log Transaction Records Sum, per second
    - RA Log CRUD Operations Sum, per second
    - RA Log Other Operations Sum, per second
    - RA CRUD Operations per DB, per second
  - CmTempdbActivity
    - TempDB Logical Reads per seconds
    - TempDB Physical Writes per seconds
    - TempDB Catalog Lock Requests per seconds
  - CmThreads
    - Tasks Executed per Thread
  - CmOsIostat
    - iostat: Wait Time(await) per Device
    - iostat: Read Wait Time(r_await) per Device
    - iostat: Write Wait Time(w_await) per Device
    - iostat: Service Time(svctm) per Device
    - iostat: Avg Queue Length(avgqu-sz) per Device
    - iostat: Busy Percent(utilPct) per Device
    - iostat: Read Operations(readsPerSec) per Device & sec
    - iostat: Write Operations(writesPerSec) per Device & sec
    - iostat: Read KB(kbReadPerSec) per Device & sec
    - iostat: Write KB(kbWritePerSec) per Device & sec
    - iostat: Avg Read KB/IO(avgReadKbPerIo) per Device
    - iostat: Avg Write KB/IO(avgWriteKbPerIo) per Device
  - CmOsMpstat
    - mpstat: CPU usage Summary
    - mpstat: CPU usage per core
  - CmOsVmstat
    - vmstat: Processes Usage
    - vmstat: Swap Usage
    - vmstat: Memory Usage
    - vmstat: Swap In/Out per sec
    - vmstat: IO Read/Write or blk-in/out per sec
  - CmOsUptime
    - uptime: Adjusted Load Average (normal load average / nproc)
  - CmOsMeminfo
    - /proc/meminfo: MemFree in MB
    - /proc/meminfo: MemAvailable in MB

### IqTune - Sybase/SAP IQ (The Column Storage Database)

- Server -> Transactions - CmIqTransaction
  - Extended PK to 'TxnID', 'VersionID', and 'ConnHandle'
- Server -> Version Use - CmIqVersionUse
  - Extended PK to 'IQConnID', and 'VersionID'

### RsTune - Sybase/SAP Replication Server

- Check if we got stuck in "gateway mode" and do "disconnect" if it happens
- Show DBMS Configuration, added 'admin logical_status'
- new collector: CmRsMemory - Replication Server Memory Usage in each module.
- new collector: CmWsRepLatency - Warm Standby Latency: How long does it take to replicate a record from Active to Standby.
- New Graphs
  - CmAdminDiskSpace
    - Stable Device Usage in PCT, for all Partitions
  - CmRsMemory
    - Stat: RS Total Memory Usage in Percent
    - Stat: Memory Usage in MB per Module
  - CmWsRepLatency
    - Latency In Seconds, from Active->Standby
    - Apply Age In Seconds, from Active->Standby
    - Data Age In Seconds, from Active->Standby

### RaxTune - Sybase/SAP Replication Agent X

- No changes, please request some if you want this tool to evolve

### HanaTune - SAP HANA

- No changes, please request some if you want this tool to evolve

### OracleTune - Oracle Database

- Capture DBMS Configuration (from v$parameter & v$nls_parameters)
- Enhanced some generic DbxTune code to always close the ResultSet's
- Added some Oracle specific datatypes

### SqlServerTune - Microsoft SQL-Server

- DBMS Configurations: 'sp_helpdb' and 'sys.databases'
- Added Host Monitoring iostat/vmstat/mpstat/uptime/meminfo for Linux (since SQL-Server now can run on Linux)
- CmWho Extended PK to 'spid', 'kpid'
- new collector: CmTempdbSpidUsage - What session_id's are using the tempdb.
- new collector: CmOsLatchStats - Show information about LATCH, from table 'sys.dm_os_latch_stats'.
- DBMS Configuration, enhanced to include/save: HelpSort, HostInfo, SysInfo, ClusterNodes
- Help text for 'CmPerfCounters', to describe what the different values are.
- New Graphs
  - CmPerfCounters
    - CPU Usage in Percent
    - CPU Usage Effective in Percent
    - SQL Batches Received per Sec
    - SQL Batches (all) In Time Span Received per Sec
    - SQL Batches (0-10ms) In Time Span Received per Sec
    - SQL Batches (10ms-100ms) In Time Span Received per Sec
    - SQL Batches (100ms-1s) In Time Span Received per Sec
    - SQL Batches (1s-10s) In Time Span Received per Sec
    - SQL Batches (>10s) In Time Span Received per SAMPLE
    - Buffer Cache Hit Rate, in Percent
    - Page Life Expectancy
    - Buffer Cache Reads per Sec
    - Buffer Cache Physical Reads per Sec
    - Buffer Cache Writes per Sec
    - Temp Table Stats
    - Tempdb Free Space
    - Version Store in Tempdb
    - Snapshot Isolation
    - Log Cache Hit Rate, in Percent
    - Log Cache Reads per Sec
    - Log Pool Requets per Sec
    - Transactions per Sec
    - Active Transactions
    - SQL Compilations per Sec
    - SQL Re-Compilations per Sec
    - Blocked Processes
    - Page Splits per Sec
    - Forwarded Records per Sec
    - Access Methods per Sec
    - Latch Waits per Sec
    - Average Latch Wait Time
  - CmSummary
    - Max Active SQL Execution Time In Seconds

### PostgresTune - PostgreSQL

- new collector: BgWriter - One row only, showing statistics about the background writer process's activity.
- new collector: CmPgTablesIo - One row for each table in the current database, showing statistics about accesses to that specific table..
- new collector: CmPgIndexes - One row for each index in the current database, showing statistics about accesses to that specific index.
- new collector: CmPgIndexesIo - One row for each index in the current database, showing statistics about accesses to that specific index.
- new collector: CmPgFunctions - One row for each tracked function, showing statistics about executions of that function.
- new collector: CmPgSequencesIo - One row for each index in the current database, showing statistics about accesses to that specific sequence.
- new collector: CmPgTableSize - Show how large tables are (rows, total, data, index & toast).
- New Graphs
  - CmPgDatabases
    - Row Fetch Efficiency (tup_fetched/tup_returned) in Percent
    - Row Fetch Efficiency ABS (tup_fetched/tup_returned) in Percent
    - Row Fetch Efficiency SUM [tup_returned, tup_fetched]
    - Connections
    - Connections Sum
    - Commits per second
    - Rollbacks per second
    - Reads per second
    - Cache Hits per second
    - Rows Returned per second
    - Rows Fetched per second
    - Rows Inserted per second
    - Rows Updated per second
    - Rows Deleted per second
    - Conflicting Statements per second
    - Temp Files Created per second
    - Temp Bytes per second
    - Deadlocks per second
    - Read Time per second
    - Write Time per second
    - DB Size in MB
  - CmPgStatements
    - SQL Statement Calls per second

### MySqlTune - MySQL database

- This is a new tool, for MySQL (5.7 and above)

### Db2Tune - IBM DB2 LWU

- This is a new tool
- It havn't got anything usefull in it yet... I had a request to do it, but I need help to create aproperiate collectors.

### SQL Window

- Show Tooltip: as a html table for all columns on current row. Easier to view any "wide" rows. This can be enabled/disabled in the Preferences
- JDBC Meta Data Information. Added new tabs 'Columns', 'PrimaryKeys', 'BestRow', 'IndexInfo', 'FK ->', 'FK <-', 'Func Columns'
- JSON output in a formated way in the output window, with syntax higlightning and code folding (only if it's a single row and columns)
- Generate SQL Statements (select, insert, udate, delete) from selected text in the editor (right click menu in the editor)
- Generate SQL Statements (insert, udate, delete) from selected rows in the ResultSet (easy to copy records, and insert them in some other place) (right click menu in the ResultSet table)
- variables can be used in the SQL text. This can be used to test shell scripts that uses variables.
  Example:
  `\set varName='tab1'
  ` `go
  ` `select * from ${varName}
  ` `go`
- Execute SSH commands directly from the editor.
  Example:
  `\ssh user@hostname "echo 'dummy'; pwd; id; date"`
- for 'Sybase/SAP ASE' and 'Microsoft SQL-Server': If '`set statistics io on`' create an extra jtable with the output and a summary (for readability)
- Cell tooltip for LOB (text/image): for image fields, lets try to figgure out the mime type and open the associated application with the content (for example PDF documents will be showed in a PDF Reader or simular)
- Editor Tooltop: hover over a word (or selected text), if the table exists extended information will be displaied about the table. (for example: rowcount, indexes, and FK references... for views: the table referenced by the view... But it depends on what has been implemented for the product we are connected to)
- In the Editor: Format (selected or all) SQL text (Ctrl+Shift+F), or right click menu
- In the Editor: Markup all word that are equal as the word you double clicked on (trying to emulate the functionality of notepad++), which makes it easier to find other instances of a word.
- bug fix: Trying to figgure out if the "sql batch" only consisted of comments... In some cases Single Line Comments in Multiline comments, resulted in stacktrace
- If the connection to the database is lost, a popup will ask you if you want to reconnect, or do it later by yourself/LI>
- Better handling of MySQL, for tooltips etc, etc
- go convert|iconv -- To Convert any character set issues...
- Code Completion: new : short-cuts
  - :db - get databases
  - :t - get tables
  - :v - get views
  - :st - get system tables
  - :sv - get system views
  - Improvements for Sybase system procedures... sp_ also searches system procedures in sybsystemprocs db
- Probably a bunch of other stuff, which I can't remember...

### Log Tail Tool

- No changes, please request some if you want this tool to evolve

## 2016-11-07

### Generic - Changes that affects all DbxTune tools

- Now java 1.7 is needed
- introduced -H homeDir for where all peronal files are stored
- Supports HI DPI screens in a better way than default... but this still needs *more* work
- Number of Graph columns in the Summary panel is now 2 by default
- Option to open the connection dialog when any of the tools starts (File->Open Connection Dilaog at Startup)
- Changed the memory indicator to a bit more "graphic", so you se in a "bar chart" how much memory is used/left
- Set a color around the main window, to indicate if it's a production/test/dev env. This so you dont apply commands in the wrong environment.
- Now option to "Grow Only" column width when you automatically resizes columns/cells in any Performance Counter
  This makes column width more constant and easier to read. This can be set on a Global Level or on each Performance counter.
- Added a filter field on most lists, which makes it easier to find what we are looking for
- Bugfix: undocked tab was not refreshed, in some cases
- Upgraded some of the third party libraries/jars
  - To version 1.4.193, Component: H2 database
  - To version ASE 16 SP2, Component: jConnect, jTSD3, DDLGen, planviewer, dsparser

### AseTune - Sybase/SAP Adaptive Server Enterprise

- Record a session: DDL Capture was changed to be more generic (internal changes)
- Record a session: SQL Capture was introduced when recording a session (but no GUI to look at them, use SQL Window to do direct select from the tables MonSqlCapSqlText, MonSqlCapStatements, MonSqlCapPlans)
- first refresh after a connect is made with shorter sleep times, just to get "something" going
- When you have 'Blocking locks'. Performance counters 'Active Statements' & 'Blocking' are automatically enabled while we are in that state.
- When you have 'Long running transactions' and 'Full logs'. Performance counters 'Databases' are automatically enabled while we are in that state.
- XML Showplan viewer will popup if you "hovering" over ObjectName and some other columns and the content starts with '*ss' or '*sq'
- XML Showplan has a Cache so we wont get the XML Plan from the ASE all the times
- Show DBMS Configuration, added a checkbox if you want to show/hide configurations for 'Monitoring'
- Disable get some DBMS Configuration. This can only be done in the config by setting: dbms.config.text..enabled=false, wher can be: AseCacheConfig, AseThreadPool, AseHelpDb, AseTempdb, AseHelpDevice, AseDeviceFsSpaceUsage, AseHelpServer, AseTraceflags, AseSpVersion, AseShmDumpConfig, AseMonitorConfig, AseHelpSort, AseLicenseInfo, AseClusterInfo, AseConfigFile
- Added Ase Plan View to the "tools" menu, so you can open it from there, also added the ability to open XML files from the Dialog (in various ways)
- SQL Capture tool, wasn't able to connect if SSH Tunnel was used when connection to ASE.
  Also added Watermarks, why some panels isn't refreshed...
  XML Showplans can automatically be displayed when you select a row in the Statements Panel (if the option is enabled)
  Note: I'm in the progress of rewriting this tool from scratch, but it will take some time to do that!
- If license is in grace mode, write a red warning message on the toolbar
- When you record a session, if the PCS Storage starts to "lag", warnings will be showed in red at the status bar
  Also if you are using the default H2 storage and it starts to get slow, a new "spillover" database is created when the queue becomes a bit to big
- DBMS Configuration, reverse engineer selected rows and open an editor with the values.
- Server -> Databases - CmDatabases
  - Added a second Graph 'Data Space Usage in Percent' + the ability to enable/disable log/data graph
  - for ASE 16.0 also capture information from the function 'spaceusage()', which gives us some new columns
  - RawSpaceUsage = The raw information from spaceusage() function
  - ReservedPages = The column 'reserved pages', from spaceusage()
  - UsedPages = The column 'used pages', from spaceusage()
  - DataPages = The column 'data pages', from spaceusage()
  - IndexPages = The column 'index pages', from spaceusage()
  - LobPages = The column 'LOB pages', from spaceusage()
  - Tables = The column 'tables', from spaceusage()
  - RowCountSum = The column 'row count', from spaceusage()
  - OamPages = The column 'oam pages', from spaceusage()
  - AllocationUnits = The column 'allocation units', from spaceusage()
- Object/Access -> Active Statements - CmActiveStatements
  - Highlight with YELLOW if SPID holds locks on the server, while in the client are in control (WiatEventID=250 'waiting for input from the network', status='recv sleep')
    also a separate row will be visible for this with the column 'monSource' set to 'HOLDING-LOCKS'
    also a checkbox if we want to sample the above 'HOLDING-LOCKS', which introduces some overhead
  - new column 'HasCachedPlanInXml' and 'CachedPlanInXml'
    also a checkbox if we want to get XML Showplans or not
  - RowsAffectedDiff, same as RowsAffected, but diff calculated
- Object/Access -> Blocking - CmBlocking
  - Small bug fix: Changed the logic to get BlockedState as like 'Blocked%' or 'Blocking%' to see more Blocking states
- Cache -> Pools - CmCachePools
  - got a major lookover and now has much more information, here are some of the new columns
  - APFReadsPct = What's the percentage of the Async Prefetch Reads (APFReads) compared to PhysicalReads.
  - PhysicalReadsPct = What's the percentage of the PhysicalReads compared to Async Prefetch Reads (APFReads)
  - AllocatedMb = Same as AlllocatedKB but as MB instead
  - PagesTouchedDiff = Same as PagesTouched but diff calculated
  - UnUsedSizeInMb = How many MB of the cache is not used
  - UnUsedSizeInMbDiff = Same as UnUsedSizeInMb but diff calculated
  - UsedSizeInMb = How many MB of the cache is used.
  - UsedSizeInMbDiff = Same as UsedSizeInMb but diff calculated
  - CacheEfficiencySlide = Same as 'CacheEfficiency' but within the "time slide" so we can see over a longer time span than between samples
  - CacheReplacementPct = How much of the cache was replaced by new pages (Turnover in sp_sysmon). This is between two samples
  - CacheReplacementSlidePct = How much of the cache was replaced by new pages (Turnover in sp_sysmon). but within the "time slide" so we can see over a longer time span than between samples
  - CacheSlideTime = This is the current time span the column `CacheReplacementSlidePct` reflects.
  - PagesReadInSlide = Summary of all diff values for the column `PagesRead` within the slide window.
  - CacheHitRate = Percent calculation of how many pages was fetched from the cache pool.
- Server -> Engines - CmEngines
  - A bunch of new columns (in ASE 15.7 SP 136 or higher)
  - HkgcOverflowsCmpact = See ASE documentation for a description
  - HkgcOverflowsRec = See ASE documentation for a description
  - LotsDelRolXacts = See ASE documentation for a description
  - LotsDelCmtXacts = See ASE documentation for a description
  - LongXacts = See ASE documentation for a description
  - PostcommitPageCount = See ASE documentation for a description
  - HkgcReq = See ASE documentation for a description
  - HkgcReqCmpact = See ASE documentation for a description
  - HkgcReqDcomp = See ASE documentation for a description
  - HkgcReqRec = See ASE documentation for a description
  - HkgcRetries = See ASE documentation for a description
- Object/Access -> Locks - CmLocks
  - New Collector that simply checks what locks we have within this sample
- Object/Access -> Objects - CmObjectActivity
  - in ASE 15.7 row_count(... ,'noblock') is used to not get blocked by others in case of a Exclusive Table lock on the table
  - Introduced a new remark 'PROBABLY_TABLE_SCAN', which tries to identify a long running table scans on big table that hasn't yet completed while we query monObjectActivity and there for UsedCount etc hasn't yet been updated
  - Background color: VERY_LIGHT_BLUE - BLOB Text/Image Column (IndID = 255)
  - UsageInMb: same as NumUsedPages, but calculated in MB so you do not have to care about what page size you have
- Server -> Processes - CmProcessActivity
  - Highligt with 'EXTREME_LIGHT_GREEN' if SPID is currently running a SQL Statement, Although it might be sleeping waiting for IO or something else.
  - New columns
  - pssinfo_tempdb_pages_diff - which is the difference in how much tempdb pages this SPID is using (pssinfo_tempdb_pages is the sum of pages used)
  - StatementStartTime - If this SPID is currently executing anything, this would be when the Statement started to execute
  - StatementExecInMs - For how many milliseconds has this SPID been executing a SQL Statement
  - HasSqlText, SqlText - only in ASE 16.x: Get SQL Text for SPID's that are currently executing SQL. Using function query_text(spid), This can be disable with the checkbox 'Get SQL Text for active SPIDs'
  - New Summary Graphs
  - BatchCountGraph - Show how many 'SQL Batches' all SPID's has been executed (SPID's that connects/disconnect quickly will not be displayed, since we can't see them...)
  - ExecTimeGraph - Show the longest/max execution time for any active SPID's
  - ExecCountGraph - How many concurrently SQL Statements where currently executing at the same time when we sampled data
- Cache -> Statement Cache Details - CmStmntCacheDetails
  - new column 'ObjectName', which you can "hover" over to open the GUI Showplan Viewer to show the XML Showplan in a GUI Format
  - The XML Plan now uses the XML Plan Cache, to not 'overload' the ASE to get the XML Plan for every record
- Summary - CmSummary
  - New field 'LockCount', so we can see how many locks we currently have in the system
    Note: this can be disabled via a checkbox if you don't want it or that it takes to much resource from the ASE
  - New Graph: LockCountGraph (for other new graphs added to the summary, see the various CM* descriptions)
  - HADR Information (anly in ASE 16.0 SP2)
- Server -> Sysmon Raw - CmSysmon
  - Implemented the section 'Cache Usage'
- Object/Access -> Table Statistics - CmTableStatistics
  - New Collector; with various table information, like 'datachange', 'UpdStatDate', 'Size', 'TableRowCount', '*ClusterRatio', '*Utilization', etc, etc...
- Server -> Workers - CmWorkerThreads
  - New Collector; with information about how worker threads are used

### IqTune - Sybase/SAP IQ (The Column Storage Database)

- Some big numbers (which really is string columns) was converted to a "higher" datatype using a slightly faulty method, causing some errors, this is enhanced
- Server -> context - CmContext
  - Added 'ConnOrCursor' to the PK. So that "duplicate errors/warning" will go away and better DIFF calculations will be done
- Server -> transactions - CmTransactions
  - Added 'VersionID' to the PK. So that "duplicate errors/warning" will go away and better DIFF calculations will be done
- Server -> version use - CmIqVersionUse
  - Changed PK from 'IQConnID' to 'VersionID' hopefully this will work better for DIFF calculations now

### RsTune - Sybase/SAP Replication Server

- Monitor & Counters -> RS Counters - CmAdminStats
  - Added 'InstanceId' to PK

### RaxTune - Sybase/SAP Replication Agent X

- No changes, please request some if you want this tool to evolve

### HanaTune - SAP HANA

- No changes, please request some if you want this tool to evolve

### OracleTune - Oracle Database

- No changes, please request some if you want this tool to evolve

### SqlServerTune - Microsoft SQL-Server

- view SQL-Server configurations
- Tooltip on the columns for the Counter Collectors (basically copied the text from MS web site)
- DDL Capture of most accessed queries etc, where it stores table info and XML Plans
- View Showplans in a separate HTML Browser or by using SQL Sentry Plan Explorer (which you need to download separate)
- In the connection dialog: show 'use Windows Authentication'
- Object & Access -> Active Statements - CmActiveStatements
  - Now also include records which holds blocking locks (same as for ASE)
  - Columns 'monSource' indicate if the record comes from 'ACTIVE' or 'BLOCKER' section of the information.
  - A bunch of new columns was also added.
  - Tooltip was added to show sqlText when you "hover" over those columns, ShowPlan show the plan... and wait_type show's some extra information
- Object & Access -> Cursors - CmExecCursors
  - New - Show details from dm_exec_cursors
- Object & Access -> Procedures - CmExecProcedureStats
  - New - Show details from dm_exec_requests
- Server -> Sessions - CmExecSessions
  - New - Show details from dm_exec_sessions
- Object & Access -> Triggers - CmExecTriggerStats
  - New - Show details from dm_exec_sessions
- Server -> Schedulers - CmExecTriggerStats
  - Added 4 graphs
  - RunQLengthSum - Show a summary of how long the runqueue is for all engines on the server
  - RunQLengthEng - Show runqueue run queue length for each engine
  - PendingIoSum - Show outstanding/pending IO's for all engines on the server
  - PendingIoEng - Show outstanding/pending IO's but for each engine
- Server -> Spinlock - CmSpinlocks
  - New - Show details from dm_os_spinlock_stats
- Server -> Waiting Tasks - CmWaitingTasks
  - New - Show details from dm_os_waiting_tasks
- Server -> Wait Stats - CmWaitStats
  - Extended the SQL Statement a bit and also added some local pie/bar charts to see the distribution

### PostgresTune - PostgreSQL

- This is a new tool, for PostgreSQL

### Db2Tune - IBM DB2 LWU

- Not yet created - Maybe in the future if someone requests it

### MySqlTune - MySQL database

- Not yet created - Maybe in the future if someone requests it

### SQL Window

- SSH Tunnel can now also be used for JDBC connections
- The Show JDBC MetaData information was extended to show more informations, like: Tables, Procedures and Functions
- If ASE Server license is in grace mode, write a red warning message on the toolbar
- tooltip on column headers was extended to also show the table origin (identify what table name this column belongs to)
- Option to "load last used file" when the tool starts
- New tools: ASE Application Trace, XML Plan View, DDL Generation (for ASE)
- When there are to many rows in the "normal layout" a message will be displayed to change to "tabbed" view to be able to see all rows
- Write output to a file instead of to the resultset window (good for exporting large result sets to a CSV file) use: 'go | tofile'
- Load file into tables from CSV files (using command: \loadfile -T tabname filename)
- Added a few more SQL Statements in the template for ASE (press Ctrl+Space twice to get the templates)
- Added a "filter" field for ResultSet tables above 15 records (conif QueryWindow.resultset.filter.threshold.rowcount)
  The filter value can be a regexp on any column OR use an SQL Like where clause, ex: where id in(1,2,3) or (name like 'syso%' and type='S')
- new command \ddlgen [options] for SYbase, which uses DDLGen.jar to reverse engineer various information
- Shipping some more jdbc drivers (SQL-Server, Postgres, Oracle), previously Sybase jConnect, SAP HANA & jTds
- HADR Information is displayed, also a popup is available which shows HADR members.
- Change ASE MDA (monitor table) configuration(s)
- For SQL-Server, in the connection dialog: show 'use Windows Authentication'
- Probably other stuff also, but I can't remember...

### Log Tail Tool

- Can now use a GUI remote file chooser over SSH connection

## 2015-06-24

- A bunch of new tools has been added... but all are still in Alpha/Beta stage
  Many internal code changes has been done to make this happen, hopefully it hasn't affected AseTune functionality.
  If you find bugs/issues, please mail me those things at goran_schwarz@hotmail.com

  Tool Name | Status | Description
  --- | --- | ---
  IqTune | Beta | Sybase/SAP IQ
  RsTune | Alpha | Sybase/SAP Replication Server
  RaxTune | Beta | Sybase/SAP Replication Agent X (Oracle, DB2, MSSQL)
  HanaTune | Alpha | SAP HANA
  SqlServerTune | Alpha | Microsoft SQL-Server
  OracleTune | Pre-Alpha | Oracle

  - If you want to test them: unzip the dbxtune_beta_tools.zip into current directory where AseTUne is installed.
    And please send feedback if you want me to enhance the tools any further. (also with ideas of what to add/implement)
  - The simplest way to create your own Performance Counters is to create a 'User Defined Counter'.
    This can be done under: main-menu -> Tools -> Create 'User Defined Counter' Wizard...
    And please send the Performance Counters to me at goran_schwarz@hotmail.com, so I can add them in next release.
- Enhancement: To all Counters
  All new rows for diff and rate is highlighted with a background color, some kind of aqua marine green.
  This can be turned on/off for every Counter, at the options panel, at the lower right corner at the check box icon.
  The option is called 'Mark new Diff or Rate entries with a Aqua Marine Green background color'.
- Enhancement: Spinlock Sum, Spinlock Act - CmSpinlockSum, CmSpinlockAct
  Added Tooltip on the panel with a description of what spinlock is and how they can be solved.
  Added Tooltip when hovering over table cells for 'spinName' and 'description' and possible solution for this specific spinlock.
- Enhancement: Objects - CmObjectActivity
  When enabling "Include System Tables", a warning popup will be displayed: "may cause performance degradation"
  When disconnection: I check if traceflag 3650 is enabled at the server side. If it is: A popup question "disable traceflag 3650?" will be displayed.
- New: RepAgent Memory Statistics - CmRaMemoryStat
  This table was introduced in ASE 16.0 PL1
- New: Segment IO - CmDeviceSegIO
  This table was introduced in ASE 16.0 SP2
- New: Segment Usage - CmDeviceSegUsage
  This table was introduced in ASE 16.0 SP2
- Enhancement: Caches - CmDataCaches
  Added columns: CASGrabs, CASSpins, CASWaits, CASContention, CASSpinsPerWait
  CASContention is based on CASSpins/CASWaits
  CASSpinsPerWait is based on number of spins per wait during this period.
  Note: This is based on MDA information from ASE 16.0 SP2 beta3.
- Enhancement: Cached Procedures - CmCachedProcs and Cached Procedures Sum - CmCachedProcsSum
  Added columns: SnapExecutionCount, SnapCodegenTime, SnapJITTime, SnapExecutionTime, AvgSnapCodegenTime, AvgSnapJITTime, AvgSnapExecutionTime
  Note: This is based on MDA information from ASE 16.0 SP2 beta3.
- Enhancement: SPID Wait - CmSpidWait and SPID Activity - CmSpidCpuWait
  Added columns: OrigUserName = Original Server User Identifier. This is the Server User Identifier before setting proxy.
  Note: This is based on MDA information from ASE 16.0 SP2 beta3.
- Other various changes
  There are probably many changes that isn't recorded in this document, so expect more changes or new stuff that isn't described here, sorry for that!
  And like I said earlier, a lot of internal code changes has been made to implement a more generic framework to support "other" DBMS types than Sybase/SAP ASE.
- SQL Window: Enhancements
  - Get sort order and character set when connection to a RepServer
  - \rpc \exec \call commands handles return codes/parameters in a better way
  - \rpc \exec \call \prep commands handles more types (bigint|numeric|timestamp[(fmt)]|date[(fmt)]|time[(fmt)]|clob|blob)
  - \rpc \exec \call \prep with type string accepts environment variables in the form ${ENV_NAME}
  - go | bcp ...: return how many rows was actually transferred by the BCP, and some other enhancements
  - Command History: you can now copy the file name from the status bar
  - Insert/Get last history commands with Crtl-Shift+H
  - Favorite commands, can be bound to a specific Vendor
  - Save/Restore "untitled" file
  - AutoCommit enable/disable functionality, if you are in AutoCommit=false, two extra buttons will be visible "Commit" and "Rollback"
    in ASE and in AutoCommit=false (chained mode) a Watermark warning will only appear if you holding locks in the server (syslocks)
  - Better error handling for Oracle, if a 'create procedure' failed, get the reasons from Oracle system tables 'ALL_ERROR'
  - Moved Completion properties into a separate dialog
  - Various enhancements to the Code Completion subsystem
  - If it's a BLOB or Text column value AND the content seems to be a picture, lets show the picture if you hover/tooltip over the value
  - Oracle show stored procedure source code (using a tooltip at error message), in case of non-handled server side exceptions
  - New File: has been implemented.
  - Dialog to view all JDBC MetaData on the Connection Level. This is under: Menu -> View -> 'View JDBC Meta Data info...'
  - Dialog to view error log information and change log level. This is under: Menu -> View -> 'Open Log Window...'
  - About Dialog to view application version. This is under: Menu -> Help -> 'About'
  - More options in the "Options" button (to the right of "exec" button)
  - Show Row Number - Add a Row Number as first column 'row#' when displaying data
  - Trim String values - Do you want to remove leading/trailing blanks from "strings"
  - Enable dbms_output.get_line, extended to support DB2 (loop: dbms_output.get_line(...) after each send batch).
  - Bug fix: in Code Completions with respect to SCHEMA prefixes and stored procedures
  - Bug fix: better handling of getting the correct object CLOB=getString(), BLOB=convertToHex(), etc...
  - Bug fix: Command line switched wasn't working to 100% (-U -P -S) to make initial connection on startup
  - Bug fix: ResultSetTableModel sometimes generated wrong data type
  - Probably a bunch of more stuff that I have forgot
- Bug fix: freeze
  The GUI seems to freeze in some cases. Hopefully this is fixed...
  The major change made was: WaitForExec dialog now always gets executed on the EDT - Event Dispatch Thread
  The above dialog was used during Java Garbage Collections
- Bug fix: Rep Senders - CmRaSenders, Log Scanners - CmRaScanners
  Both of them had wrong PK for delta calculation. It now uses ScannerSPID in CmRaScanners and SenderSPID for CmRaSenders
- Bug fix: Devices - CmDeviceIO
  For ASE 12.5.x TotalIOs: convert to numeric(10) to not get 'Arithmetic overflow' when Reads+Writes together are bigger than an int value
- Bug fix: Databases - CmOpenDatabases
  Check if user are authorized to select on master..syslogshold, if not columns OldestTran* to static values
- Bug fix: Procedure Call Stack - CmProcCallStack
  Class cast exception in rare cases for ASE 12.5.x (Short -> Integer): use Number.intValue() instead
- Bug fix: sp_monitorconfig - CmSpMonitorConfig, and 'View ASE Configuration'
  now checks for SA_ROLE before calling sp_monitorconfig
- Bug fix: Memory check
  If environment ASETUNE_JVM_MEMORY_PARAMS is set to -Xmx4096m AseTune wont start... fixed memory check for above/near 4GB
- Bug fix: Mac OSX, java 8 wont start.
  On Mac it sometimes throw Null Pointer Exceptions due to 'awt.multiClickInterval' wasn't present, now using a default value for this

## 2014-07-07

- SQL Windows: Major improvements has been done... Try it sql.bat or sqlw.sh
  It has been tested on ASE, RS, SQL Anywhere, IQ, HANA, Oracle, DB2, MSSQL, H2
- ASE 16.0 support
  Here is the big picture of what has been added for ASE 16.0
  - Version String in 16 has been changed again. SP### will now be SP## PL##. So ServicePack and PachLevel has been separated.
    Changes in AseTune was also made to the internal version "integer" which holds the parsed version number.
  - Tool 'Configure ASE for Monitoring': added parameters 'threshold event monitoring', 'threshold event max messages'
  - Processes: new column 'ClientDriverVersion' - The version of the connectivity driver used by the client program
  - Active Statements: new column 'ClientDriverVersion' - The version of the connectivity driver used by the client program
  - Cached Procedures: new column 'Active' - Indicates whether the plan for this procedure is active or not
  - Cached Procedures Sum: new column 'SumActive' - How many of this instance where column Active = 'Yes'
  - Objects: new columns
  - Scans - The number of scans on this object
  - LastScanDate - The date of the last scan on this object
  - LastScanDateDiff - How many MS ago did we do a Scan
  - Inserts - The number of inserts on this object
  - LastInsertDate - The date of the last insert on this object
  - LastInsertDateDiff - How many MS ago did we do a Insert
  - Updates - The number of updates on this object
  - LastUpdateDate - The date of the last update on this object
  - LastUpdateDateDiff - How many MS ago did we do a Update
  - Deletes - The number of deletes on this object
  - LastDeleteDate - The date of the last delete on this object
  - LastDeleteDateDiff - How many MS ago did we do a Delete
  - Statement Cache Details: new columns (the below was also back ported for ASE 15.7 SP130)
  - TotalPIO - The total PIO value.
  - TotalLIO - The total LIO value.
  - TotalCpuTime - The total execution time value. (ms)
  - TotalElapsedTime - The total elapsed time value. (ms)
  - Server - Resource Governor - New Performance Counter, works on MDA Table 'monThresholdEvent', which contains information "events" that the Resource Governor has exceeded.
  - RepAgent - Stream Stats - New Performance Counter, works on MDA Table 'monRepStreamStatistics'.
  - RepAgent - Sync Task Stat - New Performance Counter, works on MDA Table 'monRepSyncTaskStatistics'.
  - RepAgent - RA Trunc Point - New Performance Counter, works on MDA Table 'monRepTruncationPoint'.
- Enhancement: Engines
  When you use ASE 15.7 and using 'threaded kernel mode' CPU Usage calculation gets a bit strange, this due to including IOCPUTime in the calculation.
  This manifests itself as a higher CPU usages than it really is, because all engines will have a high IOCPUTime even if it's only one engine/SPID that the IO originates from. The IO is done by the IOController but the counter IOCPUTime is faulty increased on all engines.
  By the way this might be fixed by ASE CR#757246 in the future
  A CheckBox '`Collapse IOCPUTime into IdleCPUTime`' was introduced, so you can decide if you want to disregard the column IOCPUTime in the calculations. Or actually move/collapse the IOCPUTime counter into the IdleCPUTime counter.
  Note: this CheckBox is only visible if you run ASE 15.7 and if you are in process kernel mode, the CheckBox will be disabled.
  Also added the following columns, while the old columns 'CPUTime', 'SystemCPUTime', 'UserCPUTime', 'IOCPUTime' and 'IdleCPUTime' are now just difference counters.
  - NonIdleCPUTimePct - Formula: (SystemCPUTime + UserCPUTime [ + IOCPUTime]) / CPUTime * 100.0
  - SystemCPUTimePct - Formula: SystemCPUTime / CPUTime * 100.0
  - UserCPUTimePct - Formula: UserCPUTime / CPUTime * 100.0
  - IOCPUTimePct - Formula: IOCPUTime / CPUTime * 100.0
  - IdleCPUTimePct - Formula: IdleCPUTime / CPUTime * 100.0
- Enhancement: Wait
  Added WaitTimePerWait to the local graphs...
  Also enabled the CheckBox 'Include [250] waiting for incoming network data in graph
- Enhancement: SPID Wait
  Added local graphs... More or less the same graphs as in the 'Wait' tab.
  - Summary Graphs on EventID - WaitTime, Waits, WaitTimePerWait (all records is summarized over EventID)
  - Summary Graphs on ClassName - WaitTime, Waits, WaitTimePerWait (all records is summarized over ClassName)
- Enhancement: Summary Tab
  Multiple columns for the Summary Graphs (graphs side-by-side)
  Five new Trend Graphs
  - Server Waits group by 'EventID' (Choose one of the following data source `WaitTime|Wiats|WaitTimePerWait`)
  - Server Waits group by 'ClassName' (Choose one of the following data source `WaitTime|Wiats|WaitTimePerWait`)
  - SPID Waits group by 'EventID' (Choose one of the following data source `WaitTime|Wiats|WaitTimePerWait`)
  - SPID Waits group by 'ClassName' (Choose one of the following data source `WaitTime|Wiats|WaitTimePerWait`)
  - Connection Attempts Per Second (source @@connections)
  Mark field 'Lock waits', 'Full Transaction Logs' and 'Oldest Open Tran' as red when there is problems with any of them
  Added entries to Graphs sub menu
  - "Reset/Clear this Graph" - Clears the graph from data
  - "Set Max Values, in Y Axis..."
  Also added a secondary time-line-ruler, with the color "light gray".
  On single click, it will be visible/enabled on all graphs (hopefully on the same time)
  To disable/hide it click on a point where the line is enabled/visible.
- Enhancement: System Load
  Three new graphs
  - Outstanding IO's, When the refresh happened, Per Engine
  - Outstanding IO's, Average over last minute, Per Engine
  - Outstanding IO's, Summary for all instances
- Enhancement: Databases
  Some new columns
  - LogSizeFreeInMbDiff - Same as LogSizeFreeInMb, but the difference from previous sample
  - DataSizeInMb - How much Data is allocated in MB for this database
  - DataSizeFreeInMb - How much Data are we NOT using in MB
  - DataSizeFreeInMbDiff - Same as DataSizeFreeInMbDiff, but the difference from previous sample
  - DataSizeUsedPct - How much Data are we using in Percent
  - SPID - duplicate of OldestTranSpid, to enable table right click menu
- Enhancement: Temp Db
  Some new columns
  - LockContPct - Percent Calculation of Lock Contention
  - CatLockContPct - Percent Calculation of Catalog Lock Contention
- Enhancement: Summary Panel
  New field 'UTC Time Diff', which just prints out the time difference in minutes to UTC Data
- Enhancement: Objects, Cached Objects
  In the GUI Panel you can now limit number of records fetched from the server.
  This is of interest if you have thousands of tables, and it takes a long time to fetch the rows.
  The limitation is done after the `order by` has been applied...
  And the `order by` for the Counter Models are:
  - Objects - `order by LogicalReads desc`
  - Cached Objects - `order by CachedKB desc`
- Enhancement: IO Controller
  Two new graphs
  - Pending IO's, or number of outstanding IO's
  - Completed IO's per seconds
  Also removed column Pending from being difference calculated, it seems that it's a peek counter.
- Enhancement: Spinlock Sum
  Handle counter overflow in a better way.
  Algorithm bumping up to a higher datatype: and adding the negative delta on top of Integer.MAX_VALUE
  SQL: CASE WHEN (value < 0) THEN @int_max + (value - @int_min) ELSE convert(bigint, value) END -- @int_min/max is bigint
  Also at the client side, try to do a better job when the higher datatype (unsigned int) gets wrapped but NOT cleared.
  Algorithm ASE 12.5: diffColVal = new BigDecimal((maxUnsignedInt - prevColVal.doubleValue()) + newColVal.doubleValue() + 1);
  Algorithm ASE >= 15: diffColVal = Long.valueOf((maxUnsignedInt - prevColVal.longValue()) + newColVal.longValue() + 1);
  If the underlying counters are cleared, the sample interval is adjusted to reflect when the counters where cleared and the values will start at zero (as it's a counter reset)
  The goal is to eliminate problems with Counter Wrapping and Counter Resets...
  So even when it happens, the counters in the "difference calculated" values should reflect the actual DIFFERENCE from previous sample
- Enhancement: Objects Tab
  a new local checkbox 'Include System Tables'
  This checkbox sends 'dbcc trace{on|off}(3650)' to the server to include system tables in monOpenObjectActivity
  Note: it doesn't check if the traceflag is on/off for every sample, it just sends 'on/off' when you press the checkbox.
  When the Performance Counter initializes, it will set traceflag 3650 on if it was enabled last time you used AseTune (it will not turn it of)
- Enhancement: Sysmon Raw
  Implemented 3 new sysmon sections
  - Disk I/O Management
  - Network I/O Management
  - Monitor Access to Executing SQL
- Enhancement: All Performance Counters
  If counters has been cleared (for example by sp_sysmon or someone else externally)
  Then set the field 'Clear time' background color to orange
  If we are viewing a recorded session, the colored field will instead be 'Head time'
- Java Garbage Collection: Enhancements
  - Make Java Garbage Collection every X minute, the default is set to 10 minutes
    This can be enabled/disabled from view->Preferences, the interval can also be changed from here.
  - Do not show "GUI progress" if the AseTune window is not activated
    This means: the user is not "disturbed" if he are working in another window
- Enhancement: pause/refresh button
  If you are in paused mode, F5 or the "refresh" button will still work
  So if you want to do "refresh" to capture a specific user event, this is now a bit easier.
- Enhancement to tool: SQL Capture
  The tool can now be reached from all the JTable right click menus that has SPID columns in it.
  Previously this was only enabled when KPID was available.
- NEW Standalone tool: tailw
  This is the same tool as within AeTune and SqlWindow, but now as a standalone utility.
  Start it using 'tailw.bat' or 'tailw.sh'
  With the tool you can tail any file, local or remote.
  When using the remote tail, SSH connection is used to read/stream to the client side, which probably is on windows.
- Enhancement: Connection Dialog
  Connection Profile: this will make it a bit easier to connect...
  A Tree View in a new panel, located to the left of the connection attributes can be enabled.
  The connection dialog will be used for both the AseTune and SqlWindow applications
  To enable/disable the Tree View Panel, there are two buttons on the bottom left corner.
  A Connection Profiles can also be selected from a Drop Down Box, called "Use Profile"
  New Connection Profiles is "automatically" created after a connection has been successfully established, it will ask you for a name... if you change some attributes and connect, a dialog will be asking you if you want to save it or not.
  Another way to Save/Create a Profile is by pressing 'Save Profile...'
  * The SSH Connection Stuff now also takes a 'init OS Command', so you can kick off a OS command when the SSH connects this can then kick of a shell scripts, which may 'setup a new SSH Tunnel Connection chain' or setup some environment, or...
  * JCheckbox option to enable jConnect Password Encryption over the network
- Enhancement: Connection Dialog
  When you successfully has connect via host:port and the entry is NOT part of the interfaces file
  Show a popup that ask you if you want to add the entry to the interfaces file
  If the current interfaces is not writable, then an option to copy the current interfaces to a local/private files will be displayed
  If you open the interfaces file for EDIT, and it's not writable offer the above "copy option"
- Enhancement: Connection Dialog
  Also added a new option "Use Counter Template", and a list of templates you can choose from...
  When using this option, the predefined template will be used, which mean you can have different predefined Performance Counter Sets for different servers, and when you connect that Counter Template will automatically be used.
  Maintaining Template Sets is done in the existing dialog 'Settings for All Collector Tabs', which you can open by clicking 'Template Dialog'
  This dialog can also be reached "at any time" from the Main Menu->View->Change 'Performance Counter' Options...
- Enhancement: View ASE Configuration
  Added 1 tab: ASE Config File - Tries to read the ASE configuration file. This will use CIS and needs configuration 'enable file access' to be enabled
- Enhancement - Stacktrace analyzer
  Right click menu: Stack Matrix Table
  In the 'Stack Matrix Table' Dialog you can navigate within the stacktrace samples to:
  - Select a specific sample, then look at the source content in the stack file for that sample.
  - Highlight what other samples the current KPID, SPID or SUID is active in.
  - What KPID, SPID, SUID or TABLE-OBJECT is the most active within the whole sampled stacktrace session.
- SQL Window: Enhancements
  - Option: How long does a SQL Statement takes from the clients perspective.
    Client Exec Time: %MM:%SS.%ms (sqlExec=%MM:%SS.%ms, readResults=%MM:%SS.%ms)
  - Added sub command 'wait #ms' to the 'go' terminator.
    Example: `go 10 wait 100` will execute the SQL batch 10 times, and wait 100 ms after each SQL batch has been sent.
  - The progress dialog, now updates 'SQL Batch' timing when you use multi execution 'go 20'
  - Code completion works a bit better, especially for dbname.dbo.<ctrl-space> (cross database lookups, but there are still more to do with code completion, I would like to parse the SQL to figure out "where" we are located in the SQL Statement, and from there decide more about what to display... anyone that has a good parser for this...)
  - Tooltip Supplier: Some support for ASE/HANA = "hover" over a function or other SQL Statement, if there are help for it a tooltip will popup with some help (I need to do RepServer here, but it�s just a XML file with textual description...
    and also on the "todo" list is to display table/column help... hover over a tablename = get column descriptions for that table)
  - Error hint: On any error messages, try to mark them with red underline + "red cross" on the left hand side (at the line number) + red snivel to the right of the scrollbar (this is really usefull when coding multiple functions/procedures in the same file, Usually you have to "guess" what line in the file the error is at, multiple 'go' will cause the location problem)
  - ASE variable/identifier "marker" = put cursor on a identifier/variable = all other vars/tables/cols/etc with the same name will be "highlighted"
  - More information about the connected database in the status bar (especially when using the "generic" JDBC connection)
  - If you edit a file and another application changes the file, a popup will ask if you want to "reload" the file (cooperate with another editor)
  - Option to save the file before sending the SQL to the server. (good if you want to cooperate with another editor)
  - Option to restore the window size/location based on the connected server name. (after connect the window will be moved/resized)
  - In the status bar (bottom right corner) show what line and column the cursor is located at.
  - Copy Results button: right click to choose format you want to copy it as (if you just press the button, last used method will be used)
  - JTable: in the right click menu: "Execute content of selected rows" (hover of it = will show the SQL that will be executed): good for generating SQL and execute it�. Ex: select "select tabName='"+name+"', rowc=count(*) from "+name from sysobjects where type = 'U'
  - \call, \exec and \rpc now works a bit better (for ASE, IQ, SA, RS, MS-SQL) The return code is automatically fetched the CallableStament will be like '{?=call procname(params)}' for others it will be '{call procname(params)}'.
    This makes it possible to receive output parameters for variables that vendors that does not have the return code.
    Example of calling a stored proc with output params is HANA "\call procname('in-a', ?) :(string=null out)"
  - More command line switches example(-Uuser -Ppasswd -ujdbc:sap://host.acme.com:30115)
  - send 'sql init' string when you connect
  - ToolTip Provider accesses Code Completion, and show column/parameters information for tables/procedures
  - Added the Capture SQL to the tools menu... (if you connect to a ASE) this could be good to have from within SQL Window
  - All text areas using RSyntaxTextArea can now do ToUpperCase(Ctrl-U) and ToLowerCase(Ctrl-L), and the pupup menu also has to upper and lower entries.
  - The send terminator 'go' now has a bunch of sub command
  - `plain` - This temporary sets 'As Plain Text' but just for this SQL batch. ResultSets for this SQL Batch will be displayed in a RSyntaxtTextArea object.
  - `top #` - This temporary sets 'Limit ResultSet rows' but just for this SQL batch.
  - `psql` - This temporary sets 'Print the executed SQL Statement in the output' but just for this SQL batch.
  - `prsi` - This temporary sets 'Print info about the ResultSet data types etc in the output' but just for this SQL batch.
  - `time` - This temporary sets 'Print how long time the SQL Batch took, from the clients perspective' but just for this SQL batch.
  - `rowc` - This temporary sets 'Print the rowcount from JDBC driver, not the number of rows actually returned' but just for this SQL batch.
  - `append` - This temporary sets 'Do NOT clear results from previous executions. Append at the end' but just for this SQL batch.
  - `nodata` - This temporary sets 'Do NOT read the result set rows, just read the column headers. just do rs.next(), no rs.getString(col#)' but just for this SQL batch.
  - Send SQL Batch Terminator string can be changed (via a dialog), the default is 'go'.
  - Code Completion List now also shows icons...
  - When NULL Values in the ResultSet Table, set background to "light gray" to emphasize that it's a NULL value.'
  - On errors, two buttons will be visible: 'next' and 'previous', which will move the cursor to the SQL Text where the error happened
  - If you click on a (error) message in the output window, the cursor will be moved in the SQL Text, which was responsible for the error message.
  - Command History: If the SQL Text is to big do not add it to the history. (default is 5K, 5120 bytes, which can be changed with property 'CommandHistory.entry.limit.size=sizeInBytes')
  - Command History: added filter field to search the history
  - Command History: The Command column isn't "over sized" anymore... This simply means: it's less annoying when you have any wide commands in the history
  - Added ASE Set option 'set statistics *_html', which enables/disables ALL options for HTML Statistics output.
  - After the sql.ini/interfaces file has been changed via the "edit" button: Select the last edited entry as the new server.
  - Client character set can be chosen via a ComboBox, it will simply update the 'URL Options' field.
  - Favorite SQL/RCL button now you can execute commands directly from the dialog, and the dialog isn't modal anymore.
  - Show what encoding current file has (also before loading a file get/guess the file encoding, so it can be opened with the correct file encoding).
  - Input and Output window, side by side: Enable/Disable Menu->View->Preferences->Editor and Output Window side-by-side
  - Favorite SQL: Added some 'system' procedures that will be executed/created. (same as the Predefined SQL Statements in AseTune)
  - Right click menu in editor, added options: 'Visible Whitespace' and 'Visible End Of Line Markers'
  - More options in the "Options" button (to the right of "exec" button)
  - Append results (just keep appending to the output, usable if you want to compare some results, from 2 different executions)
  - Limit the ResultSet to # rows, or simply stop reading rows in a ResultSet after # rows. And a dialog to configure this.
  - Show sent SQL (more or less same as �e in isql)
  - Print ResultSet info (print out what JDBC think it will receive, java.sql.Types.VARCHAR, varchar(30), makes it easier to verify some stuff)
  - Client timing (how long did the query take from the client side, SQL Execution, Read ResultSet), tooltip will show the SQL that was executed.
  - Send using �;� (good if you are used to Oracle, this is a bit limited, or not 100% compatible with sqlPlus)
  - If connected to Oracle: enable/reads the dbms_output subsystem
  - On errors within stored procedures, get the SP Text and mark the "error" row with red. The text is displayed in the tooltip of the error.
  - Code Completion: Finer control of what to get/refresh
  - ToolTip Supplier, option to enable/disable column/parameter lookup to Code Completion
  - Ability to change JDBC AutoCommit, this is hidden, but can be enabled with property 'QueryWindow.jdbc.autoCommit.show=true'
  - Probably a bunch of more stuff that I have forgot
- PerfDemo application: Enhancements
  - Timestamp in the log window
  - Now handles/discards any produced ResultSets from the Consumer Procedures.
- Bug fix: ASE Version parsing, now handles SP50 (or SP with less that 3 digits)
  ASE 15.7.0 SP50 was previously detected as 15.7.0, this is now fixed.
- Bug fix: 'Cached Procedures Sum' in the group 'Cache'
  Error 3606: Arithmetic overflow occurred.
  Now convert the integers to bigint before doing the sum() aggregates
- Bug fix: Sometimes the GUI freezes
  Changes to check if the connection is alive has been changed, this is the second attempts at this, hope it's solved this time.
  If you see problems with this:
  Please do the following:
  - Open a command prompt, and do the following:
  - `jps`
  - `jstack on-the-pid-for-AseTune`
  - Send the output to: goran_schwarz@hotmail.com
  - Also send the c:\Users\<userName>\.asetune\AseTune.log and try to describe what you where doing...
  Note: `jps` and `jstack` is located under the JDK installation $JAVA_HOME/bin (possible c:\Program Files\Java\jdk*\bin)
- Bug fix: SQL Window
  `(script row #)` in ASE Error massages does now reflect the correct row in the script even if a "selection" is executed.
  ASE Error messages has the output:
  `Msg 99999, Level 16, State 1:`
  `Server 'GORAN_1570_DS', Line 1 (script row 12), Status 0, TranState 1:`
  `Dummy Error message, just to test`
  Which means; row 1 in the current SQL Batch, but row 12 in the editor.
  This makes it a lot easier to find errors in the editor when executing/debugging stuff.
- Enhanced Dialog: Warning - Use a Local drive for recordings
  This dialog now has an option to discard the warning for future attempts.
- Bug fix: PCS - Recording functionality
  - CmCachedProcSum - DDL Storage was made of faulty column changed from 'RequestCntDiff' to 'SumRequestCntDiff'
  - The 'label_#' column in tables that stores Summary Graphs was previously varchar(30), this is now changed to varchar(60). It was already done in the 'create table', but in the 'alter table add label_#' it was missing.'
  - When we check if the Cm* tables exists, also check if we are missing any columns, if so add them.
    This could happen if we record information from 2 different ASE versions in the same database.
- Bug fix: Active Statements
  Columns 'Command' and 'Application' was placed in the wrong order in the output for 'BLOCKER' section.
  Simply moved the columns to match the 'ACTIVE' section of the select statement.
- Bug fix: Cached Procedure Sum
  Recording of DDL for procedures was using 'RequestCntDiff' which was faulty, use 'RequestCntDiff' instead
- Bug fix: Threads
  Drop the temporary table before using it (if it exists), otherwise we will get a error in some cases.
- Bug fix: UDC Wizard
  "hint" why "next" button is not enabled was broken in some places
  Writing the SQL entries to the properties file in another way (newlines etc are escaped, so they will be visible in the Properties Dialog)
- Bug fix: All Performance Counters, JTable
  The "hide column" popup was to large (outside of the screen in some cases)
  1: new Dialog where you can enable disable columns and also change the layout order (accessible by right cling on the column header)
  2: new MenuItem "Hide this column 'ColumnName'", where ColumnName is the current column header you did right click on
- Upgraded some of the third party libraries/jars
  - To version 1.0.21, Component: JCommon
  - To version 1.0.17, Component: JFreeChart
  - To version 2.5.2, Component: RSyntaxTextArea
  - To version 2.5.2, Component: Autocomplete, part of RSyntaxTextArea
  - To version 2.5.2, Component: RSTAUI, part of RSyntaxTextArea
  - To version 1.3.176, Component: H2 database
  - To version 2013-12-09, Component: ProxyVole
  - To version ASE 16, Component: jConnect, jTSD3
  - To version 1.6.5-1, Component: SwingX

## 2013-06-28

- Support for ASE 15.7 SP100, or SAP version string, based on Service Pack or SP
  From now on ASE will be using SAP Version strings, which means no more ESD#
  Now it's called SP (Service Pack) instead of ESD#
  AseTune internal parsing of the @@version string to an integer was previously 5 numbers (15034 = 15.0.3 ESD#4), the new internal representation is an integer that consists of 7 numbers (1570042 = 15.7.0 ESD#4.2, 1570100 = 15.7 SP100, 1570101 = 15.7 SP101)
- New: tab 'Execution Time' in the group 'Server'
  In ASE 15.7 SP100 a table monSysExecutionTime was introduced, where Execution Count/Time per ASE subsystem is presented.
- New: tab 'Cached Procedures Sum' in the group 'Cache'
  More or less same as 'Cached Procedures' but it's only one row for each procedure, so it's easier to get a summary of what procedure that is executed the most.
  If you want to dig into the details of each Instance of the Compiled Procedure, use 'Cached Procedures'.
- New: Column in in tab 'Summary Panel' for ASE 15.7.0 SP100
  - `Rollbacks` - Total number of transactions that have been rolled back on the server.
  - `Selects` - Total number of select operations that have been executed on the server.
  - `Updates` - Total number of update operations that have been executed on the server.
  - `Inserts` - Total number of insert operations that have been executed on the server.
  - `Deletes` - Total number of delete operations that have been executed on the server.
  - `Merges` - Total number of merge operations that have been executed on the server.
  - `TableAccesses` - Number of pages where data was retrieved without an index on the server.
  - `IndexAccesses` - Number of pages where data was retrieved using an index on the server.
  - `TempDbObjects` - Total number of temporary tables created on the server.
  - `WorkTables` - Total number of work tables created on the server.
  - `ULCFlushes` - Total number of times the User Log Cache was flushed.
  - `ULCFlushFull` - Number of times the User Log Cache was flushed because it was full.
  - `ULCKBWritten` - Number of kilobytes written to the user log cache.
  - `PagesRead` - Number of pages read on server wide.
  - `PagesWritten` - Number of pages written on server wide.
  - `PhysicalReads` - Number of buffers read from the disk.
  - `PhysicalWrites` - Number of buffers written to the disk.
  - `LogicalReads` - Number of buffers read from cache.
  If you connect to a server with a lower version that ASE 15.7 SP100, these fields will not be displayed
  ASE 15.7 SP100 also needs sp_configure 'enable monitoring' for these fields to be populated.
  If you connect to ASE 15.7 SP100 and 'enable monitoring' is off, these fields will be marked as yellow, meaning they are not to be trusted.
  This behaviour is for backward compatibility with earlier version where you can view "some" counters without monitoring enabled.
- New: Graphs in the Summary Panel
  - 'ASE SubSystem Operations - Execution Count (15.7 SP100 or above)'
  - 'ASE SubSystem Operations - Execution Time, in Micro Seconds (15.7 SP100 or above)'
  - 'ASE SubSystem Operations - Execution Time, in Micro Seconds per Count (15.7 SP100 or above)'
  - 'Transaction per second - Number of Transaction per Second (15.0.3 esd#3 or above)' - label 'Rollbacks is new in 15.7 SP100'
  - 'CRUD per second - Number of Sel/Upd/Ins/Del/Merge per Second (15.7 SP100 or above)'
  - 'Table/Index Access per second - Number of Table/Index Access per Second (15.7 SP100 or above)'
  - 'Tempdb Object, Work Tables per second - Number of Tempdb Objects and Work Tables per Second (15.7 SP100 or above)'
  - 'User Log Cache per second - User Log Cache Information per Second (15.7 SP100 or above)'
  - 'IO's per second - Number of IO's per Second (15.7 SP100 or above)'
  - 'Logical Reads per second - Number of Logical Reads per Second (15.7 SP100 or above)'
- Summary Panel - Enhancement
  - `fullTranslogCount` - Checking if any database transaction logs are full, using `lct_admin('logfull', dbid)` was to expensive, or time consuming.
    This was replaced with checking the `monOpenDatabases.TransactionLogFull` column, this is only done if the user has `mon_role` granted and configuration `enable monitoring` is enabled. If the above is not true, we fall back and use the old `lct_admin('logfull', dbid)` check.
  - `oldestOpenTranInSec` - If you are connected with low authorized user you would get 'SELECT permission denied on object syslogshold' when trying to get oldest open transaction. If you are not authorized to select on syslogshold, a static value of -99 will be used instead.
- Main Frame GUI - Enhancement
  - Tab Panel Navigation "next" and "previous" buttons in toolbar at the top. This is a "stack" of visited "performance tabs", which makes it easier to go "back" to the previously used performance counter(s).
  - Sleep time between samples - can now also easily be changed via a ComboBox in the status panel (at the bottom left hand side)
- New: Column in in tab 'Objects' for ASE 15.7.0 SP100
  - `NumLevel0Waiters` - Number of times Level0 Scan start had to wait due to Utilities that requested us to wait
  - `AvgLevel0WaitTime` - Average time waited, if waited to get Level0 access (ms)
- New: Column in in tab 'Spinlock Activity' for ASE 15.7.0 SP100
  - `SpinlockSlotID` - ID for this spinlock in the spinlock memory pool
  Also keeping the old behaviour to summarize/collapse all Spinlocks that have multiple instances into one row.
  This collapse option is implemented as a checkbox in the "local options panel"
  Tooltip or Hover over any cell for the columns `OwnerPID, LastOwnerPID` will show a tooltip that basically displays "select * from master..sysprocesses where kpid = ${LastOwnerPID|OwnerPID}" which makes it easier to discover what user/application that was holding the spinlock.
- New: Column in in tab 'Cached Procedures' for ASE 15.7.0
  - `CompileAgeInSec` - Formula: datediff(ss, CompileDate, getdate())
  - `AvgCPUTime` - Formula: CPUTime / ExecutionCount
  - `AvgExecutionTime` - Formula: AvgExecutionTime / ExecutionCount
  - `AvgPhysicalReads` - Formula: AvgPhysicalReads / ExecutionCount
  - `AvgLogicalReads` - Formula: AvgLogicalReads / ExecutionCount
  - `AvgPhysicalWrites` - Formula: AvgPhysicalWrites / ExecutionCount
  - `AvgPagesWritten` - Formula: AvgPagesWritten / ExecutionCount
- Bug fix: Performance Counter 'Threads' - missing records
  This problem has only been seen if ASE runs on the Windows platform.
  To few records in the Performance Counter. This was due to a bad join from monThread to monTask
  The join towards monTask is only to distinguage syb_system_pool:NetController and syb_system_pool:DiskController
  Now using a outer join to get records that doesn't have a record in monTask
  monThread.KTID *= monTask.KTID: the KTID in monTask only has a matching KTID for currently running SPID/Threads but the rest of the "engine" threads has no matching entry in monTask, because they are not executing anything.
- Enhancements to Graphs attached to the Performance Counter 'Threads'
  The labels for the 'CPU Thread BusyTicksPct Average per Pool Type' now contains how many threads it averages on.
  The labels for the 'CPU Thread BusyTicksPct Usage per Thread' now reflects the "thread number" within the `ThreadPoolNameType` instead of the `ThreadID` this makes it a bit more readable I hope.
- New tool - Stacktrace analyzer
  This tool can be used in strange circumstances to analyze in what code path the ASE Server is in.
  The tool will just read a stacktrace file produced by the ASE Server using a special mode on the server (called sybmon) a small shell script template is also available. But the shell script has to be created executed by you. Then FTP the output and read the file using this tool.
  If this tool will be used a lot, then I will need to implement a SSH execution of the script and grab the output back to the local machine so you don't need to do all the above. Then the tool would be a bit more automatic if you really need that functionality, let me know and I will see what I can do!
- New: In 'ASE Configuration' view
  - A new tab which shows information from sp_helpsort
  - Tab Layout Policy is now 'scroll' by default.
- Change - The default behaviour of "change to tab"
  When any blocking locks or long running transactions appears in the system a "popup" will become visible that asks you what you want to do "stay in current tab" or "change to tab ???".
  The default was previously to: "Always show this dialog when this happens" and "Change focus to tab '???'"
  The new defaults are: "Stay in current tab, or simply, do nothing" and "Remember the above choice until the application restarts"
- Change - Most JTables now has a "right click" pupup menu on the column headings
  Most JTables you can now choose what columns to be visible, simply by "right click" on the column header and pupup menu will be visible with some options.
- SQL Window - Enhancements
  - Better error handling if connection is aborted/killed in the ASE Server while processing
  - Added some static text to the ASE code completion 'alter thread pool...'
  - Command history, which is persisted and shared between different Concurrent SQL Windows instances
  - Favorite SQL/RCL button now has the ability to add/change/remove your own SQL Favorites using a small dialog
  - If you want to connect to a JDBC source where the driver is not in the current classpath, a dialog has been created so you can add JDBC driver to the system without having to change the bat or shell file that started the SQL Window tool.
  - Open a new SQL Window tool, with that is connected to the same server. Use 'Clone Connect' in the menu.
  - Using Icons instead of text for the "Exec" and "GUI Showplan Exec"
  - Query Options has been put under a button/popup called "options", this to save some space.
  - in ASE 15.7 SP100 - HTML showplan has been added to the "Set" button and the HTML will be displayed as rendered a HTML page/output
  - Use "Drag and Drop" on the buttons "Exec" and "GUI Showplan Exec" to execute a SQL Statement. This will be usable from the History window, that is if you have two SQL Windows opened. But only one History Window... Then you can do "Drag" from the History Table and "Drop" on the SQL Windows "exec button" where you want it to be executed.
  - Simple 'grep' functionality. do: `exec sp_who<NL>go | grep 'sa'` will do grep for 'sa' in the output from the resultset(s)
  - Simple 'bcp' functionality. do: `select * from t1 where c1='x'<NL>go | bcp dbname.owner.desttab -Usa -Pxxx -STO_SRV` will try to BCP values into the table in the destination server.
  - Simple 'rpc' functionality. do: `\exec|rpc sp_who ? :( string = '2' )` will try to do a RPC call to ASE using a JDBC CallableStatement to execute the procedure. In this example we call sp_who with a string parameter of value "2". This is also the only way to check return code and output parameters from a stored procedure.
  - to get help on go commands do: `go | ?`
  - Bug fix: In some cases a error popup window was displayed to early, then it was hard to figgure out if the command was still running or not. This is fixed.
  - Bug fix: SSH tunneling had problems when reconnecting to same server, or when the connection was lost due to inactivity.
- Log Tail - Enhancements
  - Removed some bug: In some cases a whole line were not treated as one line...
  - Added: how many "old" rows that should be included in the tail.
  - Added: Start from the beginning of a file..
- New jConnect driver
  From jConnect 6.05 to jConnect 7.07 SP100
- Large Icons
  For some windows and dialogs, a set of 32*32 pixel icons was created. Works better for Windows7 and MacOS
- Loading Recorded Session - Enhancements
  - When connecting to the data store, show a GUI Dialog what you are connecting to.
    This to help determinate if we are actually doing something... or if the GUI is blocked in some way.
- Offline DDL View - Enhancements
  - Double click on a row will show the content (same as: rightClick -> Show)
  - Arrow Keys: up/down, after stop moving, wait for 350ms, then 'show content'
- Bug fix: Query Timeout
  The GUI was locking itself up in a strange way after a Query had been running past the query timeout.
  Hopefully this is fixed now, please report the kind of behaviour if you find/see them, this so I can fix it.
- Bug fix: NO GUI mode
  Headless machines did not work - Removed some restrictions, and now AstTune -noGui mode works when started on a headless machine
- Bug fix: User Defined Counters
  After a re-connect User Defined Counters SQL Statements was set to NULL or "blank", which is now fixed.
- NO GUI mode - sleep interval enhancement - experimental
  By using the property 'offline.script.waitForNextSample' you can add a Java Script that can decide when we want to do a new "refresh".
  Example:

      		offline.script.waitForNextSample=function waitForNextSample(waitStartDate) \
      		{ \
      			var nowDate = new Date(); \
      			var secOnTheMinute = nowDate.getSeconds(); \
      			if (secOnTheMinute == 1) \
      				return 0; \
      			else \
      				return 1000; \
      		} \
      		waitForNextSample(new Date(waitStartedAtTime));

  The above script returns 0 when clock has passed 1 second after each whole minute
  If not just, return 1000, which means: let AseTune sleep for 1000 ms, then call this Java Script again.
  Note: the variable `waitStartedAtTime` is set by AseTune to indicate what the time was after a complete refresh of counters.
  - return 0 = go and do refresh of counters
  - return a number = Tell AseTune to sleep for this amount of milliseconds before it will call the script again.
  - return anything else, like a string or nothing means: use the ordinary sleep time.

## 2013-03-03

- Bug fix: Performance Counters initialized with wrong ASE release
  When connecting to ASE Release 15.0.2 or higher, the ESD# was stripped of.
  This was due to trusting the sp_version 'montables' information.
  The 'montables' version string is not maintained with the same version string as 'installmaster'
  Solution in ASE 15.0.2 or higher is to use the 'installmaster' entry instead of 'montables'
  This bug was introduced in version '2013-02-25', and in my opinion so serious I needed to make a new release ASAP.
- Change in tab: 'SPID Wait', 'SPID Activity' and 'Waits'
  Stopped using the tempdb.guest.monWaitEventInfo and tempdb.guest.monWaitClassInfo
  Now doing the translation from WaitEventID to the descriptions directly in java code instead.
  This was done due to: if you have 'granular permissions' configured in ASE 15.7 ESD#2 there was problems reading the above tables.
- Change in tool: SQL Window
  Use IGNORE_DONE_IN_PROC=true as the default option when connecting to ASE.
  This will exclude all extra/intermediate row counts when executing a stored procedure.

## 2013-02-25

- Major enhancements to the tool SQL Window
  Most enhancements are for the stand alone version. (`sqlw.bat` or `sqlw.sh`)
  Try it out and send me feedback and suggestions
  Enhancements:
  - Connect to "any" JDBC driver (the driver must be in the CLASSPATH, at least for the moment, work in progress for this)
  - Save (SQL/RCL) text content to a file. Save As. Load a file. Last Used files... (see the File Menu)
  - Can now connect to Replication Server
  - Syntax highlighting for RCL - Replication Command Language
  - Basic Code Completion for Replication Server Commands and Connection names
  - View Current ASE Configuration has been added, if you are connected to ASE.
  - View Current RepServer Configuration has been added, if you are connected to RS.
  - RS: Resume/Suspend RepAgent/DSI dialog. (right click in the JTable and do 'resume')
  - RS: View Stable Queue Content. (Menu->View->View Stable Queue Content) (right click in the JTable and do 'view Queue Content') NOTE: this is't 100% complete yet, need more work done
  - Row Count option (see row count for ins/upd/del) and not just the selects. stored procedures like 'sp_who' will add many row counts. use URL Option `IGNORE_DONE_IN_PROC=true` in the Connection Dialog to minimize additional row count entries from stored procs.
  - ASE: check @@trancount and @@transtate after each executed SQL Statement. a WARNING "watermark" will be visible if you are in a transaction. (try it: simply execute `begin tran`, then `commit/rollback tran`. to reset status 'TRAN ABORT', execute `begin tran commit tran`)
  - Predefined SQL/RCL commands, clock the RCL/SQL Button on the Toolbar and kick it off.
  - RS: Admin who_is_down button on the Toolbar.
  - Watermark in the RCL/SQL text editor, that tells you if you are connected or not...
  - Status bar at the bottom that tells you user/server you are connected to, also tooltip on the ASE/RS field (located at lower right corner) will show you @@servername, JDBC Product Name, @@version, ports the server listens at.
  - Improved Code Completion for for ASE:
    - exec <Ctrl-Space> will show procedures only, if the procedure start with 'sp_' all system stored procedures will be displayed. You can also use '*' to do wildcard searches, for example 'exec sp_*rep_agent*' will show any procedure that has the name 'rep_agent' in it.
    - use <Ctrl-Space> will show databases
    - FIXME: add more stuff here...
  Bug fixes:
  - Binary datatype is now displayed as 0x{value}.
  - A bunch more.
- Java Memory usage by AseTune
  AseTune uses a lot of memory, first of all Swing consumes quite some memory, then all data in the Performance Counters does take memory, then that data is stored in the 'in-memory' history, so we can go back and view data that within the history limit (defaults to 10 minutes)
  When not yet connected, I think I have decreased the memory usage a bit (some unnecessary calls to Swing was removed).
  But when you are connected and sampling data, the only thing I can do is try to cleanup or give the Java Garbage Collector hints that it should go to work.
  The following strategies has been implemented...
  - A memory monitor thread, that will check how much memory we have left every third second and take actions (see below).
  - On every data sample, also check if we are reaching "near end of memory" and take actions (see below).
  - If the Swing Event Dispatch Thread receives OutOfMemoryError a notification to the Memory Monitor is sent.
  - By Default the In-Memory storage is disabled. Or actually set to a low value (1 minute).
  The following Actions is available for AseTune.
  - if less than 130MB left
    - enable option 'Do Java Garbage Collect after counters has been refreshed'.
      Note: the GUI might be perceived as a bit slow/sluggish when it has to do all that extra extensive Java Memory Garbage Collections
    - show a pop up message that the above has been enabled.
    - This can be disabled again from Menu->View->Preference->Do Java Garbage Collect after counters has been refreshed
  - if less than 30MB left
    - The 'in-memory' counter view is cleared
    - The 'in-memory' counter history is set to a low value (typically 0 or 1 minute)
    - Advice the Java Garbage Collector to clean up memory
    - show a pop up message that this has been done.
    - 'in-memory' counter history, can be set back at the top of the summary, graphs panel.

  The default threshold values can be changed in any of the properties files.
  Low-on-memory: `asetune.memory.monitor.threshold.low_on_memory.mb=newValueInMB`
  Out-of-memory: `asetune.memory.monitor.threshold.out_of_memory.mb=newValueInMB`

  When 'Do Java Garbage Collect after counters has been refreshed' is enabled a small GUI pops up to tell you what's it doing since it might be a time consuming task to do the Java Garbage Collection.

  Please let me know if you still have memory issues.
  Or simply raise the JVM Parameter -Xmx####m to as high as possible values (see below for default values). This is done in the asetune.bat or asetune.sh script. or by setting the environment variable `ASETUNE_JVM_MEMORY_PARAMS` to `-Xmx####m -Xms##m`

  Also new default values for Java memory:
  - 32 bit JVM's will use 1024 as max memory (JVM switches: -Xmx1024m -Xms64m)
  - 64 bit JVM's will use 2048 as max memory (JVM switches: -Xmx2048m -Xms64m)
- Connection Dialog Changes (added SSH Tunnel option)
  Connecting to ASE can now be done over an SSH Tunnel, which is automatically setup from AseTune via any SSH Server.
  This is used to simplify connecting to any ASE that is located on a "shielded" network.
  An example could be if you sit on one network and want to connect a ASE that is on the development network, and the firewall wont let you connect to the ASE port on the development net. As long as you can connect to any host that has a SSH server on the development net, problem is solved by the SSH Port Forwarding functionality. (or wait for the network administrators to open the port, if it's allowed)
  Here is the "big picture" how it works
  - Setting up a local listener port (for example 2955).
  - The ASE Client (AseTune) connect to localhost:2955.
  - The SSH connection tunnels/forwards the packets sent on localhost:2955 to an "intermediate" SSH Host (via port 22).
  - The SSH Daemon then opens a connection to the Destination host:port (lets say asedevhost:5000) and forwards the data traffic.
  This means: as long you can connect to the "intermediate" SSH Host you can connect to a ASE located on the other side.
  The above help text and a picture trying to explain it will be visible in the Connection-SSH Dialog.
- New: View -> View/Tail the ASE Errolog
  If you want to view/tail the ASE errorlog file directly (and not via the monErrorLog table)
  This is a simple tail on the log file. If the log files is not located on the same machine, which you run AseTune on, a SSH (Secure Shell) connection is made to the remote machine to start the tail, the output of the tail is then streamed back to the "log viewer" GUI which just presents the data.
  In fact, you can view/tail "any" file on the (remote) machine, not just the ASE server log.
  The same functionality is available in the stand alone SQLWindow tool (sqlw.bat or sqlw.sh), which is perfect if you connect to Replication Server and want to view the (remote) RepServer log at the same time as you enter various commands.
- New: tab 'Spinlock Act' in the group 'Server'
  In ASE 15.7.0 ESD#2 a table monSpinlockActivity was introduced, where spinlock contention is visible
  This Performance Counter is a complement to 'Spinlock Sum', which uses table sysmonitors.
- New: tab 'Memory Usage' in the group 'Server'
  In ASE 15.7.0 ESD#3 a table monMemoryUsage was introduced, where internal memory usage and allocations is visible
- New: Graphs in the Summary Panel
  - 'Number of Concurrent Blocking Locks' - Grab 'LockWaits' from the CmSummary and present it in a graph.
  - 'Oldest Open Transaction in any Databases' - Grab the new 'Oldest Open Tran' field from the Summary and present it in a graph.
  - 'Number of Disk Operations (Read+Write), per Second and Device' - Read+Write Disk Operations for all devices from the Devices Performance Counter and present it in a graph.
  - 'Number of Disk Operations (Read), per Second and Device' - Read Disk Operations for all devices from the Devices Performance Counter and present it in a graph.
  - 'Number of Disk Operations (Write), per Second and Device' - Write Disk Operations for all devices from the Devices Performance Counter and present it in a graph.
  - 'Device IO Service Time (Read+Write) in Milliseconds, per Device' - IO Service Time for Read+Write on all devices from the Devices Performance Counter and present it in a graph.
  - 'Device IO Service Time (Read) in Milliseconds, per Device (15.7 esd#2 or later)' - IO Service Time for Read on all devices from the Devices Performance Counter and present it in a graph.
  - 'Device IO Service Time (Write) in Milliseconds, per Device (15.7 esd#2 or later)' - IO Service Time for Write on all devices from the Devices Performance Counter and present it in a graph.
  - 'Statement Cache Hit Rate, in Percent' - From tab 'Statement Cache'.
  - 'CPU Thread BusyTicksPct Average per Pool Type (15.7 and later)' - Average BusyTicksPct per PoolType. from Threads 'tab'.
  - 'CPU Thread BusyTicksPct Usage per Thread (15.7 and later)' - BusyTicksPct per Thread. from Threads 'tab'.
  - 'Host Monitor - CPU Graph' - From tab 'Host Monitoring' - 'OS CPU (vmstat)'.
  - 'Host Monitor - Load Average Graph' - From tab 'Host Monitoring' - 'OS Load Average'.
  In ASE 15.7 ESD#2, the granularity of IOTime is much better than in earlier releases where the resolution was 100ms
  So that is why the Graphs for 'Device IO Service Time' based on monDeviceIO (CmDeviceIo) was introduced.
  Also a bug or strange behavior was introduced in ASE 15.7 ESD#2 in table 'monIOQueue', column 'IOTime', where the IOTime seems to be incremented in some arbitrary larger number than milliseconds. This might be solved in next release (I think this is solved in ASE 15.7 ESD#4) so I didn't want change or remove the Graph connected to CmIoQueueSum...

  In ASE 15.7 The 'CPU Thread BusyTicksPct' Graphs is a better CPU measurement when using Threaded Kernel.
  The monEngine.IOCPUTime shown some kind of average from the 'DiskController' Thread. Then the server looks like it's overloaded with IO even if you are just issuing a table scan from a single SPID.
  Note: Watch out for 100% values from 'BusyTicks' for 'syb_blocking_pool' and 'syb_system_pool' (RTC pools 'Run To Completion') they are always 100% in first versions, this is fixed in ASE 15.7 ESD#3
  I might release a new AseTune, when I know how to fix the issue in a better way. Suggestions are always welcome, since I don't have access to any good or highly used ASE Server for testing.

- New: Summary Panel, added one field 'Oldest Open Tran'.
  When there are databases that has Transactions that has been Opened for more than a second, a red icon in the status bar shows up, telling you how old the oldest open transaction is in seconds.
  If you press the icon, you will jump to the 'Databases' tab.
  In Databases Tab, databases with 'Open Transactions' will be marked with a yellow background.
- New: Column in in tab 'Objects' for ASE 15.7.0 ESD#2
  - `IOSize1Page` - Number of 1 page physical reads performed for the object
  - `IOSize2Pages` - Number of 2 pages physical reads performed for the object
  - `IOSize4Pages` - Number of 4 pages physical reads performed for the object
  - `IOSize8Pages` - Number of 8 pages physical reads performed for the object
  - `PRSSelectCount` - Number of times PRS (Precomputed Result Set) was selected for query rewriting plan during compilation
  - `LastPRSSelectDate` - Last date the PRS (Precomputed Result Set) was selected for query rewriting plan during compilation
  - `PRSRewriteCount` - Number of times PRS (Precomputed Result Set) was considered valid for query rewriting during compilation
  - `LastPRSRewriteDate` - Last date the PRS (Precomputed Result Set) was considered valid for query rewriting during compilation
- New: Column in in tab 'Devices' for ASE 15.7.0 ESD#2
  - `ReadTime` - Total time spent reading from the device (ms)
  - `WriteTime` - Total time spent writing to the device (ms)
  - `ReadServiceTimeMs` - Calculation, formula: ReadTime / Reads
  - `WriteServiceTimeMs` - Calculation, formula: WriteTime / Writes
- New: Column in in tab 'Processes' for ASE 15.7.0 ESD#2
  - `IOSize1Page` - Number of 1 page physical reads performed by the process
  - `IOSize2Pages` - Number of 2 pages physical reads performed for the process
  - `IOSize4Pages` - Number of 4 pages physical reads performed for the process
  - `IOSize8Pages` - Number of 8 pages physical reads performed for the process
- New: Column in in tab 'Databases' for ASE 15.7.0 ESD#2
  - `PRSUpdateCount` - Number of updates to PRSes (Precomputed Result Set) caused by IUDs (Insert/Update/Delete) on the base table
  - `PRSSelectCount` - Number of times PRSes (Precomputed Result Set) were selected for query rewriting plan during compilation
  - `PRSRewriteCount` - Number of times PRSes (Precomputed Result Set) were considered valid for query rewriting during compilation
- New: Column in in tab 'Databases' for to see Old Open Transactions (from syslogshold)
  - `OldestTranStartTime` - Start time of the oldest open transaction in this database.
  - `OldestTranInSeconds` - Number of seconds since the oldest open transaction in this database was started.
  - `OldestTranName` - Name of the oldest open transaction in this database
  - `OldestTranSpid` - SPID, which is resopnsible for the oldest open transaction in this database
  - `OldestTranProg` - Application Name, which is resopnsible for the oldest open transaction in this database
  - `OldestTranPage` - Page number in the transaction log, which holds the oldest open transaction in this database
- New: Column in in tab 'Statement Cache Details' for ASE 15.7.0 ESD#2
  - `AvgScanRows` - Average scanned rows read per execution
  - `MaxScanRows` - Maximum scanned rows read per execution
  - `AvgQualifyingReadRows` - Average qualifying data rows for read DML per execution
  - `MaxQualifyingReadRows` - Maximum qualifying data rows for read DML per execution
  - `AvgQualifyingWriteRows` - Average qualifying data rows for write DML per execution
  - `MaxQualifyingWriteRows` - Maximum qualifying data rows for write DML per execution
  - `LockWaits` - Total number of lock waits
  - `LockWaitTime` - Total lock-wait time (ms)
  - `SortCount` - Total number of sort operations
  - `SortSpilledCount` - Total number of sort operations spilling to disk
  - `TotalSortTime` - Total sort time (ms)
  - `MaxSortTime` - Maximum sort time (ms)
  - `ParallelDegreeReduced` - The number of times the degree of parallelism in the plan was reduced but it still executed as a parallel query (parallel plans only)
  - `ParallelPlanRanSerial` - The number of times a parallel query plan was adjusted so that it executed without parallelism (parallel plans only)
  - `WorkerThreadDeficit` - The total thread deficit for all executions of a parallel plan (parallel plans only)
- New: Column in in tab 'Cached Procedures'
  - `RequestCntDiff` - Same as RequestCnt, so show both the Abs values and Diff for RequestCnt in the diff/rate view.
- New: Option in in tab 'Statement Cache Details'
  - `sampleMetricsCountGtZero` - include or exclude `where MetricsCount > 0` In some ASE Versions we would want this, but in some not...
- ASE Config View Dialog
  - This is now a stand alone window
  - It can be refreshed
  - It's accessible from the 'stand alone' SQL Window tool (sqlw.bat or sqlw.sh)
- In most text editors fields, looking at SQL or various text
  - Right Click Menu - Now has a 'find' entry
- Bug fix: Spinlock Sum - for ASE Cluster Edition
  Some values would end up as "duplicate" entries. In ASE-CE the field_id was reused for some counters. So the join was also done on field_name
  Also the field_name 'fglockspins' can optionally be discarded. If you choose not to include 'fglockspins' in ASE-CE, the performance will hopefully be much better, number of records for 'fglockspins' could easily be more than 100000 removing those entries from the calculation would speed it up. And since it's so many rows with those values, a average wouldn't say that much. (a high value in one or two 'fglockspins' would just average out on all the other rows.)
- Bug fix: Recoding a session for a ASE 15.7.0 EDS#2
  Record a AseTune session on a ASE 15.7.0 ESD#2 was not working, which is now fixed.
  The problem was that lct_admin() was returning 'unsigned int' and in previous releases it simply returned data type 'int'. If the storage engine (in this case H2) doesn't support data type 'unsigned int' the recoding failed.
  Solution: I'm simply casting the 'unsigned int' to 'int'
- Bug fix: various fixes
  - Offline mode, OfflineSessionViewer, Show on day,hour,minute level did not work as intended.
  - Offline mode, keyToRid was not initialized in some cases, which caused problems in getRowNumberForPkValue()
  - Small layout issue with the Split pane for panels with Extended info panels, like local graphs etc
  - Additional help text, and tip when a Performance Counter depends on other Performance Counters.
  - If you connect to a server that is NOT ASE, then print some errors about it.
  - 'mon_role' granted to any "user defined role(s)" attached to the user, was not detected at login time.
  - Mac users now has 'Mac menu bar' and the "doc icon". This behaviour can be changed in the asetune.sh
  - Menu Shortcut keyboard character has been changed from "Alt" to "Platform dependant" (Windown: Ctrl, Mac: Cmd)
  - The Graph display ordering was a bit faulty. new/unknown Graphs is now added to the end...
  - Connection Dialog, ASE User name, must be filled in.
  - Connection Dialog, could in some cases be too small, so the OK button wasnt visible.
  - If saved main window location, seems to be out-of-screen, do not set the location. this might break virtual desktop or multiple screens
  - ASE Application Tracing Tool, is now a bit more stable. Doing deferred updates to the trace window each 100ms (if new trace entries has arrived)
  - Offline Wizard, various small fixes
  - A bunch of other small bug fixes
- Upgraded some of the third party libraries/jars
  - To version 1.6.4, Component: Swing Labs, JXTable
  - To version 1.2.17, Component: Log4J
  - To version 1.0.14, Component: JFreeChart
  - To version 2.0.5.1, Component: RSyntaxTextArea
  - To version 2.0.5.1, Component: Autocomplete, part of RSyntaxTextArea
  - To version 1.3.169, Component: H2 database
  - To version 2012-12-03, Component: ProxyVole

## 2012-06-19

- Bug fix: Connection Dialog
  In some cases the OK button for making a new connection was not visible.
- Bug fix: Create 'User Defined Counter' wizard.
  The SQL statement was in some cases missing at the last page.
- Bug fix: Move to tab. (blocking locks, full transaction log)
  When 'blocking locks' or 'full transaction log' happened, a pop up with the option to move to that Performance Counter Tab should be visible.
  This did not work after redoing the "tab grouping" in version 3.0.0 (2012-04-20)
- Bug fix: ASE 15.7 and above using ASE non English localizations
  If you where using a non English localization as the ASE default language and ASE 15.7 or higher the tool had problems starting. Now I just issue 'set language us_english' when connecting.
- Bug fix: various fixes
  - Early initialization of the encryption package, makes the connection dialog open faster.
  - Capture SQL tool, could overflow on datediff when calculating execution times.
  - Re-initialize Performance Counters on errors 10353 and 12052 (config was changed)
  - when ASE is in 'SHUTDOWN mode', skip writing some warning messages...
  - Tab 'SPID Activity' had some issues when highlighting SPID's
  - GTable had null pointer exceptions in some cases when saving currently selected row
  - SQL Statements was in some cases faulty generated for ASE 15.0.0, regarding pssinfo
- Bug fix: various bug fixes for ASE Cluster Edition
  - The Performance Counter Properties Dialog did not initialize with Cluster Edition checkbox to a valid state
  - CmSummary now removes checking of tempdb's that are not on the local instanceid.
  - CmIoQueueSum now summarizes disk io's for all instances.
- New: In 'ASE Configuration' view
  - A new tab which shows information from sp_tempdb.
  - A new tab which shows information from sp_cluster 'logical'. Only if ASE CE
- Removed: Performance Counters, in Group 'RepAgent'
  - RA SQL Activity - This wasn't working from a MDA point of view.
  - RA SQL Misses - This wasn't working from a MDA point of view.
- Changed: Wizard; Create 'Offline Session'.
  - Added a checkbox 'do not enter' ASE information, instead use command line switches.
  - Dropdown boxes on JDBC driver and URL for PCS or recording database
  - Added some help text and pointers to Command Line Switches
  - Also added some new fields, like 'Start the recording at'
- Changed: Persistent Counter Storage, when using ASE as the PCS
  If ASE is used as the Persistent Counter Storage when recording a session
  - AseTune is now using DYNAMIC_PREPARE and caching/reusing the prepared statements when writing data to the database.
  - The 'set delayed_commit on' is also issued.
  This makes it a bit faster when using ASE as the Persistent Counter Storage
  Note: Using H2 database for PCS is still the preferred choice, because it's much more lightweight and not 100% ACID, it flushes the data to disk at a later stage, which makes it a much faster choice when recording a session. And also the H2 database is probably located on your local PC so we don't store information on the same server as we are monitoring.
- Changed: Persistent Counter Storage, database is full
  For ASE and H2: when hitting full database errors, the connection to the monitored server is closed and the entries in the PCS queue is discarded.
  A GUI message is also displayed about this if you are in GUI mode.
- Changed: Performance Counter initialization.
  if ASE Binary is of a later version than installmaster, we have a out-of-sync situation.
  A question with what version Performance Counters should be initialized with is presented.
- Upgraded some of the third party libraries/jars
  - To version 1.3.167, Component: H2 database
  - To version 2.0.3, Component: RSyntaxTextArea, AutoComplete

## 2012-04-20

- New layout of Performance Counters
  It started to be "to many tabs", so now the Performance Counters are grouped in "sub tabs"
  The following tab groups are available

  Group Name | Hold Performance Counters
  --- | ---
  Server | 'Processes', 'SPID Waits', 'SPID Activity', 'Databases', 'Temp Db', 'Waits', 'Engines', 'Threads', 'System Load', 'Spinlock Sum', 'Sysmon Raw', 'Errorlog', 'Deadlock', 'Lock Timeout', 'sp_monitorconfig', 'Work Queues'.
  Object/Access | 'Objects', 'Procedure Call Stack', 'Active Objects', 'Active Statements', 'Blocking', 'Table Compression', 'Missing Statistics', 'QP Metrics'.
  Cache | 'Caches', 'Pools', 'Cached Procedures', 'Procedure Cache Load', 'Cached Objects', 'Proc Cache Module Usage', 'Proc Cache Memory Usage', 'Statement Cache', 'Statement Cache Details'.
  Disk | 'Devices', 'IO Sum', 'IO Queue', 'IO Controllers'.
  RepAgent | 'Rep Senders', 'Log Activity', 'Log Scanners', 'Log Scanners Time', 'RA SQL Activity', 'RA SQL Misses', 'RepAgent Sysmon'.
  Host Monitor | 'OS Disk Stat', 'OS CPU(vmstat)', 'OS CPU(mpstat)', 'OS Load Average'.
  User Defined | Performance Counters created by you or any other user.

  If you want to have the old behavior, with no sub group, this can be changed in View->Preferences->Group Performance Counters
- New: in tab the 'Waits', graph(s) on the right hand side (local Graph)
  You can view 'WaitTime' and/or number of 'Waits' by the individual Events, or as a summary at the Wait Event Class
- New: in the tab 'Devices', graph(s) on the right hand side (local Graph)
  You can view 'TotalIOs', 'Reads', 'APFReads' and 'Writes' in different graphs.
  The distribution in the graphs are by Logical Device Name
- New: in the tab 'IOSum', graph(s) on the right hand side (local Graph)
  You can view 'IOs', 'IOTime', 'AvgServ_ms' in different graphs.
  The distribution in the graphs are by 'IOType' (User Data, User Log, Tempdb Data, Tempdb log, System)
- New: in the tab 'Procedure Cache Module Usage', graph(s) on the right hand side (local Graph)
  You can view Active Memory Usage, by ModuleName
- New: in the tab 'Procedure Cache Memory Usage', graph(s) on the right hand side (local Graph)
  You can view Active Memory Usage, with one Summary Graph, or one graph for each 'ModuleName'
  The distribution in the graphs are by 'AllocatorName'
- New: tab 'OS Load Average' in the Host Monitor group
  Show 'Load Average' from the OS, this is grabbed from the os command 'uptime'
- Change: users does not require 'mon_role' and 'enable monitoring' anymore
  If a user logs in without 'mon_role' or if 'enable monitoring' is not enabled, AseTune will still allow the user to login.
  But the environment will be restricted. Number of available Performance Counters will of course be very limited. The Summary panel will still be maintained, in there you have access to ASE Servers global variables for CPU, Disk and Network. Graphs connected to the summary fields will automatically be enabled.
- New: Column in in tab 'Cached Objects'
  - `ProcessesAccessing` - Number of processes currently accessing the object
  - `TotalSizeKBDiff` - `TotalSizeKB` as diff calculated from previous sample
  - `CachedKBDiff` - `CachedKB` as diff calculated from previous sample
  - `TableCachedPct` - How much of this table is kept in the cache. Formula: `CachedKB/TotalSizeKB * 100`
  - `CacheID` - Just the ID of the cache
  - `TotalCacheSizeKB` - The size of the data cache where this table is residing
  - `CacheUsagePct` - How much space does this table use of the whole cache. Formula: `CachedKB/TotalCacheSizeKB * 100`
- New: Column in in tab 'Engines'
  ThreadID was introduced in 15.7.0
- New: Column in in tab 'Objects'
  ObjectCacheDate was introduced in 15.7.0: The date and time when the descriptor for this object was installed in the metadata cache
- New: Column in in tab 'Statement Cache Details'
  StmtType was introduced in 15.7.0: The type of the cached statement.
- New: Performance Counters, in Group 'RepAgent'
  - Rep Senders - Provides information on Rep Agent Sender tasks.
  - Log Activity - Provides information on Rep Agent Log Activity.
  - Log Scanners - Provides information on Rep Agent Scanner tasks.
  - Log Scanners Time - Provides information on the time spent by the Rep Agent Scanner tasks.
  - RA SQL Activity - Provides statistics on statements replicated as SQL for all open objects.
  - RA SQL Misses - Provides statistics on statements that could not be replicated as SQL for all open objects.
  This is the first version of them, so please send input on enhancement.
- New: Performance Counters, in Group 'Server'
  - SPID Activity - SPID CPU and Wait Time activity per sample interval and a bunch of other values as well
    This implementation was mainly done by Niklas Andersson.
  - Threads - Provides information on ASE threads.
  - Work Queues - Provides information on work queues.
  This is the first version of them, so please send input on enhancement.
- New: Performance Counters, in Group 'Object Access'
  - Table Compression - Table Compression Information
  This is the first version of them, so please send input on enhancement.
- New: Performance Counters, in Group 'Disk'
  - IO Controllers - Provides information on I/O controllers.
  This is the first version of them, so please send input on enhancement.
- New: In the Wizard 'Create Offline Session', added Performance Counters Local Options
  A new page where you can change Local Options for Performance Counters.
- New: In 'ASE Configuration' view
  - A new tab which shows information from monThreadPool. Only from 15.7 and above
  - A new tab which shows information from monDeviceSpaceUsage. Only from 15.7 and above
  - A new tab which shows information from monLicenses. Only from 15.0 and above
  Added a 'refresh' button.
- New: In 'Configure ASE for Monitoring' dialog, added 'capture compression statistics'
  Added the sp_configure 'capture compression statistics' to the dialog.
- New: Counters for ASE 15.7.0 ESD#1
  In tab 'Engines' added columns: `HkgcPendingItemsDcomp, HkgcOverflowsDcomp`
  In tab 'Objects' added columns: `HkgcRequestsDcomp, HkgcPendingDcomp, HkgcOverflowsDcomp`
- New: for all Performance Counters, a "mini" graph in table cell
  On Percent counters, a new "mini" graph is visible at the bottom of the cell, which tries to write a small bar graph of the percentage used.
  This can be disabled using the property 'TabularCntrPanel.table.graph.percent=false'
- Enhancement: in Performance Counter 'QP Metrics', collapse all qtext column rows into 1 row.
  Previously only 255 bytes chunks of the SQL text (qtext) was displayed per row, and the sequence was incremented for every row/chunk
  Now all SQL chunks are "collapsed" into the sequence 0 row. So only 1 row is presented per saved SQL Statement
- Enhancement: When you get a out-of-memory pop up.
  When you get a out-of-memory, I previously just purged the in-memory history
  In addition I also now lower the in-memory history size to 1 minute
- Enhancement: no-gui mode.
  - -e hh[:mm] to enable/start the recording at a specific time later on the same day.
  - -d default: used the template database name '${ASETUNE_SAVE_DIR}/${SERVERNAME}_${DATE}'
  - -n small|medium|large|all templates, can now be "altered" using "templateName,+CmName,-CmName" to add/remove CM's from any of the predefined templates
- Enhancement: to connection dialog, deferred connect
  - connect at a specific time later on the same day
  - Set a stop/disconnect time
  The above parameters is good if you want to record a night session/batch job that is executed in a specific time frame
- Enhancement: to Dialog: Configure ASE for Monitoring...
  If you change a parameter the dependent CM's will be re-initialized, so you don't have to re-connect after a Monitor config change.
- Bug fix: Disable Monitoring on disconnect or exit.
  In the "ASE Monitor Configuration" panel you can choose to "disable monitoring", "prompt" on exit.
  This has been extended to "on exit or disconnect", so new when this option has been enabled, a dialog is displayed when you disconnect from a ASE (or it simply disables monitoring).
- Bug fix: Dialog "Configure ASE for Monitoring", Disable Monitoring.
  If you have disabled monitoring using the Dialog "Configure ASE for Monitoring", then monitoring can not continue, so lets simply do disconnect...
- Bug fix: Connection Dialog, choosing a sql.ini/interfaces file.
  Sometimes the old sql.ini/interfaces file was loaded, this is better now.
  Also if you choose a new sql.ini/interfaces file, and it not in the correct format a question will pop up, to ask if you want to edit the file.
- Bug fix: When ASE is in shutdown mode, put data collection on hold.
  Previously all sorts of error messages was thrown, when ASE was in shutdown mode
  Not it says 'ASE Shutdown in progress' in the watermark and data collection is simply put on hold until the ASE goes down. And if reconnect is enabled, it will then wait for the ASE restart to complete and connect again.
- Bug fix: Code completion in the SQL Window tool.
  Fixed some issues here, and also added some more static completions.
  The code completion initialization, can now be canceled.
- Bug fix: All Performance Counters, restore selected row after refresh.
  Restore of selected row in the table did not work as supposed.
  Now it tries to restore current selected table row by using the primary key, if it can't use the primary key, it will try to fall back to last selected model row.
- Bug fix: Tabs with graphs, failed if columns were moved/reordered
  In tabs that has graphs, sometimes failed creating the graph.
  This was only in the case when users had moved/reordered columns, then I used index position instead of model position when getting data.
- Bug fix: All Tabs. Remember Abs/Diff/Rate counter settings
  Previously it was always set to RATE, but now last decision is saved and restored after restarts
- Bug fix: Various small fixes
  As always, various bug fixes that I have forgot about or to small to mention.
- Upgraded some of the third party libraries/jars
  - To version 1.3.166, Component: H2 database
  - To version 2.0.2, Component: RSyntaxTextArea, AutoComplete
- Finally major code re-factoring has been done
  - All Performance Counters are now in individual files.
  - Basic foundation for ability to add modules like RS, IQ, etc.
    But it's a long way until this will be finalized.
  - and more...

## 2012-01-05

- New Functionality: ASE Application Tracing
  A new tool 'ASE Application Tracing', for details see http://www.sybase.com/files/White_Papers/ASE15-apptrace-070507-wp.pdf for more information how this works.
  This is just a GUI on top of ASE 'set tracefile ...' functionality.
  The add on for the GUI is that it can work with remote files, so you can start the trace on your local client (probably a PC), then if the ASE is located on a Unix/Linux host an Secure Shell SSH connection will be opened to do tail of the trace file. This makes it much easier to view the trace file.
  Also current executed stored procedures etc will be fetch and displayed in the local interface
  This is a really usefull tool if you want to trace what a specific SPID is doing in the server.
  Note: This uses a lot of memory in the GUI... lets see if we can fix that in any future release.
- Change: Performance Counter Properties Dialog.
  When you right click on the JTabbedPane, you can choose Properties.
  This Dialog was previously a Simple HTML based Dialog.
  Now it's Swing based components with following functionality
  - Check generated SQL, even if the Performance Counter is not initialized.
  - Simulate other ASE Versions: check what SQL will be generated for another ASE release, and in ASE Cluster Edition
  - Syntax highlighted SQL area
  - Color highlights in SQL area for PrimaryKey, Difference and Percent columns
- Changed behavior: Connecting to different ASE Version, no need to restart AseTune
  It's now supported to connect to ASE Version X, then disconnect and connect to another ASE Version
- New: SQL Code Completion in SQL Window tool
  Using Ctrl+Space you bring up SQL Code Completion, for table names and columns
  For the moment I don't use a parser to check where in the SQL code you are, so for the moment it's kind off basic... Column completion work works in a limited way for table aliases.
  Please report strange behavior...
- New: DDL storage functionality
  In some of the performance counters, get top 10, or all rows (DBName, ObjectName) and get various information from the ASE Server (sp_help/procText, sp__optdiag, sp_depends) on tables/procedures
  If the table or procedure has dependencies to other tables/procedures, add q DDL request of those objects as well.
- Change: Connection Dialog, PCS: now show DDL Lookup/Storage properties
  When recording a session you can now choose to do "DDL Lookup" and save it to the Persistent Counter Store
- New: View DDL
  The entries stored be the 'DDL storage functionality' can be viewed in a TreeTable,
  Access the 'View DDL' from:
  - MainMenu -> Tools -> DDL Viewer
  - Any Performance Counter: Right click menu -> DDL Viewer
  Note: For the moment 'DDL View' is only available in "offline" mode. In the future this could also be implemented for "online" access.
- New: Performance Counter 'SPID Waits'
  Use this to track wait time for individual SPID's, There will be approximate 5-10 rows per SPID. So there could be quite a bunch of rows in this one...
- New functionality in Tab: Databases
  A local bar graph "Transaction Log Space Usage in Percent". Colors of the bars (green = less than 80% usage, orange = between 80-90% usage, red = above 90% usage)
  A Dialog has also been created to choose what databases should be part of both the local bar graph and the attached trend graphs. This is on the button "Set 'Graph' databases".
- New functionality in Tab: Sysmon Raw
  Calculating some of the ordinary "sp_sysmon" calculation.
  The goal is to present some kind of sp_sysmon report simulation in the "Extended Info Panel".
  Maybe a TreeTable or similar will present the information, but a lot of work is still needed here.
  For now: the information is printed as raw text, in the Extended Info Panel, which is located on the right hand side for the text report.
- New: Column in in 'Statement Cache Details'
  In ASE 15.7, Show 'show_cached_plan_in_xml(SSQLID, 0)' in the details.
  The information will be saved/displayed in raw XML format until a good reader is available.
- Change: tab 'Objects': Column name 'ObjectName' was showing IndexName instead of table name
  In AseTune Version 2011-09-30, 2.6.0: I changed to used `ObjectName` column instead of `ObjectName=object_name(...)`
  This was not so good since the "raw" `ObjectName` displayed the IndexName instead of table name, so
  I changed it back to display the table name using `object_name(...)`, and also added a column (in ase 15.0.2 or higher)
  that displays the IndexName. This will make it easier to filter and sort on table name.
- Change: tab 'Objects': Added some columns
  - NumUsedPages - which just does: `data_pages(A.DBID, A.ObjectID, A.IndexID)`
  - RowsPerPage - which calculates number of rows per page
  - Remark - which tries to figure out what is happening of with this object. is it a table scan, etc...
  The above columns will make it easier to check if many LogicalReads "ok", meaning is this on a small or large table
  This can be disabled/enabled from the Local Options, in the 'Objects' tab. Or from any of the configuration files, using property 'CMobjectActivity.TabRowCount=true|false'
  Note:The column 'Remark' should be treaded as 'experimental', use tooltip on the cell to get more information about the remark.
- Change: tab 'Proc Cache Memory Usage', now holds more values
  Now we do outer join on monProcedureCacheModuleUsage *= monProcedureCacheMemoryUsage
  This means that memory modules that does not have detailed sections, now is available by the 'head/main' section. For example Dynamic SQL, does NOT have any details, which made it a bit harder to read. But now these modules are also available in the details.
- Change: Summary Panel, some negative counters to zero
  In the summary panel, some counters that could turn negative are now reseted to zero
  (Transactions, io_total_read, io_total_write, pack_received, pack_sent, packet_errors)
  If the above counters goes negative trend graphs would be "unreadable"
  while other columns should be able to turn negative like (Connections etc...)
- Add/Changes to: SQL Window, stand alone utility
  When starting the SQL Window tool as an external java process, using sqlw.bat. A menu bar and a toolbar panel is created. This so you can connect/disconnect to ASE servers using the Connection Dialog.
  The stand alone utility 'sqlw' is released in this drop.
- Change: Tool: SQL/Query Window
  - Now has a "cancel" button, when a statement is executing
  - All ASE SQLExceptions are converted into SQLWarnings and printed along with the result sets.
    For non ASE connections (offline storage) will still throw SQLExceptions
- Change: Tool: Capture SQL
  - New field to write "extra where clause, on active statements
  - New field to write "order by, on active statements
  If SQL error happens, the refresh will STOP and wait for you to fix any syntax errors in "where restrictions".
  Last executed SQL statement can be viewed wit tooltip on the panel.
  Note: This tool will be rewritten from scratch "soon"
- Changed text in error message: Connection Dialog
  Some users had problems connecting, simply due to a faulty password.
  They just interpreted the "raw" JDBC error message in faulty way... It was to complicated
  So I added extra text in case the main exception was 'JZ00L'.
- Change: "Extended Info Panel" on all Performance Counter tabs.
  The "Extended Info Panel" on each 'tab' has previously always been invisible/minimized. Now the divider location is saved to the user temporary properties. This so we can remember how large the Extended Info Panel is for the 'Databases' or other Performance Counter tabs.
- Change: all Performance Counters, right click menu
  The context sensitive right click menu now has alternate column names and optional columns
  This simply means that they will be enabled (available to click on) on more tabs.
- Add Messages: Wait Event Dictionary
  Added 5 new 'Wait Event Descriptions' from ASE Documentation 'Performance and Tuning Series: Monitoring Tables', Document ID 'DC00848-01-1570-01'
- GUI Change: in all Performance Counters when reading offline database.
  Previously the field 'Clear Time' was empty, this field is not visible in offline mode anymore
  Instead a new field 'Head Time' is visible, so we can see that what head/main time this tab is displaying, this makes it easier to detect if we are looking at the correct data.
- Change: H2 PCS, Persist Counter Storage, connect properties
  When recording a session in a H2 database, set some basic options if they are not part of the URL
  - `DATABASE_TO_UPPER=false` - Do not convert Table and Column names to upper.
  - `MAX_COMPACT_TIME=2000` - The maximum time in milliseconds used to compact a database when closing.
  Also setting some options in the database after connect
  - `SET COMPRESS_LOB DEFLATE` - Compress LOB Large OBjects, text/image fields.
  - `SET DEFAULT_LOCK_TIMEOUT 15000` - Change the LOCK timeout to 15 seconds.
  - `SET QUERY_TIMEOUT 15000` - Change query timeout timeout to 15 seconds.
  Also do '`SHUTDOWN COMPACT`' in method, stopServices()
  The intention for these changes is that the database size will be smaller...
- New: Tooltip on SPID, in offline mode for all Performance Counter
  Tooltip on SPID in JTable cells now work in offline mode as well
  First it loads the 'Processes tab', then it check if the SPID is there and reads all the information.
  If the 'Processes' is not saved, then the ordinary 'Not able to load...' will be displayed.
- Enhanced functionality: The offline/in-memory Slider can be moved with keyboard shortcuts.
  The offline/in-memory Slider can now be moved using
  - Crtl+left or Ctrl+right for one tick at time
  - Shift+left or Shift+right for 10 ticks at time
  - Crtl+Shift+left or Ctrl+Shift+right move to next slot that has data
- Changes to: Menu enable/disabled
  Menus is now more context sensitive of what mode we are in. When connected etc, some menus will be enabled and disabled.
- Changes to: Disconnect
  Now when we disconnect from ASE or the offline database, a dialog is popping up telling you what it for the moment is doing.
- Add: include servername in Window Title
  Show the ASE servername, or host:port number which this instance of AseTune is connected to
  format: 'AseTune - SrvName - extra information string'
  If we are NOT connected, no server name will be specified.
- Change: Screen capture.
  The text in the Dialog can now be Copy+Paste.
  This makes it easier to access the storage directory.
- Change: HostMonitor data type when storing counters
  HostMonitor, expanded most data type storage from 7,1 or 5,1 to 10,1
- Change: ASE View Configuration Dialog
  Some columns is now "editable", this simply means easier to do copy + paste
  It does NOT mean, that you can change the configuration values...
- Change: Do graceful shutdown on Persistent Counter Handler
  PCS try to do graceful shutdown, with "timeout" of 10 seconds.
- Change: Main Window, Status Panel, added status for PCS Handler
  Details about how many entries that are in the Different Persist Queues are now visible in the main window... a field with 3 counters has been added
- Change: Offline reader, read "User Defined Counters", UDC from offline DB
  If the recorded database contains UDC, User Defined Counters that is NOT installed in the GUI simply create the UDC and add it to the GUI temporarily
- Upgraded some of the third party libraries/jars
  - To version 15.5 ESD#11, Component: jconn3.jar, jconn4.jar, jConnect Driver from JDK 15.5 ESD#11
  - To version 1.3.163, Component: H2 database
  - To version 15.7, Component: dsparser.jar, Sybase extension for reading interfaces, sql.ini files
  - To version 15.7, Component: planviewer.jar, Sybase extension to view showplan, used by dbisql.exe
  - To version 3.2.2, Component: jchart2d, Graph package
  - To version 4.2, Component: MigLayout, Layout Manager
  - To version 20111102, Component: proxy-vole, Access Internet Via WEB Proxy
  - To version 1.6.2-2, Component: swingx-core, JXTable...
- bug fix: Tab Databases
  In offline mode, when reading the Performance Counters from the offline database, the local bar graph wasn't updated.
- bug fix: Tab Missing Statistics
  This used to much CPU resources for checking if column was part of any index.
  It uses a little less CPU now, but I still need to tune it in more detailed.
- bug fix: Tab Spinlock Sum
  in pre 15.0 ASE, 'Arithmetic overflow occurred' could happen due to sum(many 'int' rows), now converting counters to numeric(12,0) before doing sum.
  In ASE 15.0 and higher, convert to bigint is done
- bug fix: Tab Processes
  On highly utilized systems, timeouts happened. I guess this is due to joining with the monX proxy tables.
  So now I snapshot monProcessActivity, monProcess, monProcessNetIO into temp tables and join from there.
- bug fix: Copy + Paste as 'Ascii Table' from JTables, now sorted
  Now the copied table will be in the same sorted order as the JTable.
- bug fix: Tab Summary, Databases: Timeout when creating new databases.
  Added 'readpast' to sub selects on sysdatabases & sysusages, this will hopefully just skipping reading this row from the ASE Version where locking schema 'datarows' has been used for System tables. If I remember correctly this is ASE 15.x
- bug fix: Performance Counter Tables, save/restore column layout
  Previously only 1 layout was saved, so if we connected to several different ASE versions, this wasn't working very well
  Now only column layout will be saved for each ASE Server version.
- bug fix: Tab Spinlock Sum, for ASE Cluster Edition
  For cache partitions (cachelets) to many rows was returned, causing the "difference" calculation found "Duplicate key" and logged error messages about that.
- bug fix: asetune.bat, problems with quote and backslash chars in Env Variables
  problems if SYBASE was set to:
  - set SYBASE="c:\Program Files\sybase"
  - set SYBASE="c:\Program Files\sybase\"
  - set SYBASE=c:\Program Files\sybase\
  The trailing \ will be stripped, also the surrounding quotes...
- bug fix: Persistent Counter Storage, Strings can be overflowed.
  When storing to long Strings in the PCS, in H2 we got Exception: org.h2.jdbc.JdbcBatchUpdateException: Value too long for column
  Solution: If the string we are going to store is "longer" that the database allowed storage size, then truncate the end of the string (the part of the string that we want be able to store), and add '...' as a marker that is has been truncated.
- bug fix: Copy + Paste for to ascii table did not handle newLine.
  Now the ascii table looks better if any "cell" has newlines in them
  If this happens, I also add an extra vertical row separator, so it's easier to see where a new row starts
- bug fix: in offline mode, the filter 'column list' wasn't loaded.
  This is now fixed
- bug fix: tab 'Objects': to many DuplicateKey errors/Exceptions.
  Changed the internal PrimaryKey from: '`[InstanceID,] ObjectName, DBName, IndexID`' to: '`[InstanceID,] ObjectID, DBID, IndexID`'.
  Hopefully this will cause to less DuplicateKey errors.
- bug fix: Problems to login
  When a user logs in, I check for 'mon_role' (and 'sybase_ts_role'), if user doesn't have those roles I will try to automatically grant those roles, if current user is authorized to do this.
  Fix: current user should have 'sso_role' not 'sa_role' to do automatic grant.
- bug fix: check if connection is still open, done to often
  This only means that the isOpen() check will hopefully already been done by the watchdog, which means that the GUI will not freeze or lag behind, because it's not the Swing Dispatch Thread that calls the database to check if the connection is still open.
- bug fix: Main Tabbed Pane, "tabs": Scroll/Wrap properties
  If the Performance Counter 'tabs' doesnt fit on one row, do we want the tabs to "scroll" or "wrap"
  Have all tabs on one row (scroll), or use multiple rows for 'tabs' (Wrap), Warpa is the default behaviour.
  This was previously not saved and restored on AseTune restart, now it is
- bug fix: User Defined Counters, show Properties works
  User Defined Counter, you can now view the SQL Statement with properties

## 2011-09-30

- Bug fix: Connecting to ASE
  If $SYBASE was set, but "$SYBASE/ini" directory or "$SYBASE/ini/sql.ini" file didn't exist, the Connection Dialog complained about: Connecting to a different ASE Version, This is NOT supported now...
  This is now fixed.
- Changes in: all "tabs" and the dialog "Change 'Performance Counter' Options..."
  - Query timeout can be changed in the "options" panel in each "tab".
  - A new column for Query Timeout has been added to the "Change 'Performance Counter' Options..." dialog.
  - New default value to 30 seconds on some Performance Counters that may take a lot of time, you'll find them in the above dialog.
- Change in: tab "missing stats"
  The column list now also reflects if the specific column is part of any index, and the position within the index
  column 'UpdStatDate' shows what data last update statistic was made on the table, 'not found' if statistics hasn't been updated at all.
- Changes in: SQL Window
  - Added template/completion for 'sp_helptext...'
  - Allow 'go' in the SQL Text, currently executing SQL will be highlighted in the 'executing SQL' panel.
  - Added a button 'Set'. With this you can quick choose 'set showplan' and other query optimizing/diagnostics settings.
- Changes in: When starting AseTune
  The SYBASE environment variable is not mandatory anymore
  On Windows: If AseTune can't find the 'sql.ini' file, a dummy one is created under '$HOME/.asetune/sql.ini'
  On Unix: If AseTune can't find the 'interfaces' file, a dummy one is created under '$HOME/.asetune/interfaces'
  HOME is get from: `System.getProperty("user.home");`
  In this file you can add you'r own servers if you like to.
- Changes in: Connection Dialog
  Added a button "Edit", so you can edit the content of interfaces or sql.ini file directly from the GUI.
- Changes in: Performance Counter Properties Dialog
  Now also shows:
  - Depends On ASE Configuration
  - Depends On ASE Role
  - Depends On Other Performance Counter
  - Needs ASE Version
  - Needs ASE CE Version
- Changes in: Performance Counter "Spinlock Sum"
  Rewrote the query to use temporary tables for 'sysmonitors' instead of the "real" table.
  This will hopefully be much faster, at least for ASE prior to ASE 15.0.2
- Limitation: for Persistent Counter Storage, when using ASE earlier than 15.0
  I wont allow pre 15.0 ASE servers to act as PCS. This because long table names are not allowed.
  If you have any complaints about this, please inform me.
  Also if the Page Size is less than 4K, I will issue a warning message saying that you may run into problems. This because the PCS is probably storing wider rows than 1961 bytes.
- Bug fix: All Performance Counter Collectors, Read timed out
  When Exception: JZ006: Caught IOException: java.net.SocketTimeoutException: Read timed out.
  was raised in some cases, the GUI was simply blocked.
  I added jConnect property 'QUERY_TIMEOUT_CANCELS_ALL=true', which sends a CANCEL request to the ASE server upon timeout Exceptions. I hope that this will fix most timeout hang situations.
  If it doesn't, please do the following and send me the results.

              cd $JAVA_HOME
              cd bin
              C:\Program Files\Java\jdk1.6.0_24\bin>jps
              8428 AseTune
              7100 QueryWindow
              9620 Jps
              3844 Agent
              6140
              C:\Program Files\Java\jdk1.6.0_24\bin>jstack 8428
              ...Send me the output of this command...

- Bug fix: AseTune need 'sa_role' to monitor anything in ASE 15.0.2 and above
  This was due to the fact that I called ASE function `asehostname()`, which needs 'sa_role'.
  This is now fixed.
  Consequence: if you use ${ASEHOSTNAME} in the URL template when storing data in the Persistent Counter Storage, you will not get the asehostname(), instead you will get the @@servername
- Bug fix: Change 'Trend graph history time' was broken. with stack trace in AseTune.log
  This is now fixed.
- Bug fix: in 'ASE Monitor Configuration Dialog'
  `Capture Missing Statistics` options were enabled even if we had connected to a ASE earlier than 15.0.3 ESD#1
  `Query Processing Metrics` options were enabled even if we had connected to a ASE earlier than 15.0.2
- Bug fix: All Performance Counter tabs, with local options
  Tried to save local options to the combined properties instead of TEMP properties.
  This is now fixed.
- Bug fix: During Connect, getting ASE Cache Configuration was blocking in some odd cases.
  Added Query Timeout off 10 seconds when snapshotting Various ASE Configurations.
- Bug fix: Parsing some @@version strings with "ESD#x.y XXX" strings
  Changed logic to find first non number character and stop there. This means that sub ESD version wont be used.

## 2011-09-09

- Product name change from AseMon to AseTune.
  Note: old temporary configuration changes are not converted.
  If you want to look at your old temp configuration it's at: $HOME/.asemon/asemon.save.properties
  $HOME: on a windows box is at: `C:\Documents and Settings\username`
- New: Added some items when grabbing ASE Configuration at startup.
  'sp_version', 'sp_shmdumpconfig' and 'sp_monitorconfig'
- New: Added shortcut buttons to Sourceforge and Facebook at the Summary Panel. This is just a simple way to get people to use SourceForge and Facebook to do bug and enhance reports
- New tab: QP Metrics
  This gets information from the view 'sysquerymetrics' in all databases.
  Note: Use sp_configure 'metrics elap max', 'metrics exec max', 'metrics lio max', and 'metrics pio max' to set the server side filtering. Otherwise you will probably end up with full transaction log etc in all smaller databases.
  Extra functionality that are supported on the 'tab'
  - Local SQL filtering, just adds SQL to the where clause.
  - Drop/purge of current QP Metrics
  - Jumping directly to ASE Monitor Configuration Dialog
  This is based on the white paper Performance Tuning in ASE 15 Using Query Processing Metrics
- Added ASE 15.7 MDA columns to Performance Counters

  Tab Name | Column Names
  --- | ---
  Objects | `SharedLockWaitTime, ExclusiveLockWaitTime, UpdateLockWaitTime`
  Data Caches | `Status, Type, CacheSize, ReplacementStrategy, APFReads, Overhead`
  Pools | `LogicalReads, PhysicalWrites, APFReads, APFPercentage, WashSize`
  Cached Procedures | `ExecutionCount, CPUTime, ExecutionTime, PhysicalReads, LogicalReads, PhysicalWrites, PagesWritten`
  Procedure Call Stack | `ExecutionCount, CPUTime, ExecutionTime, PhysicalReads, LogicalReads, PhysicalWrites, PagesWritten`
  Statement Cache Details | `OptimizationGoal, OptimizerLevel`
  Active Statements | `HostName, ClientName, ClientHostName, ClientApplName`
  Deadlock | a bunch of new columns
  Lock Timeout | This tab is new for 15.7

  Note: I used a preliminary document for what's new on 15.7, so I have NOT tested this yet.
- New: in tab 'Databases', a new right click menu entry 'dump tran ${DBName} with truncate_only'
  This makes it easier to truncate the transaction log in a specific database if we run out of space.
- New: in tab 'Databases', 4 new Columns 'DbSizeInMb', 'LogSizeInMb', 'LogSizeFreeInMb' and 'LogSizeUsedPct'
  Also added 2 graph to keep track of "Log Space left in MB" and "Log Space used in PCT".
  Databases in the attached Graphs can be excluded
  Exclude a database from graphs is based on:
  - Part of the skip list
  - Database size is lower than the skip limit
  Db skip list can be changed with the property `CMopenDatabases.skipDbsInGraphs=db1ToSkip, db2ToSkip...`
  Db size limit can be changed with the property `CMopenDatabases.skipDbsWithSizeLtInGraphs=#mb`
  In the file '`$HOME/.asetune/asetune.user.properties`'.
  The default skip list is: `master, model, pubs2, sybmgmtdb, sybpcidb, sybsecurity, sybsystemdb, sybsystemprocs`
  The default size limit is: `300`
  If you always want a database present in the graphs, add database to property `CMopenDatabases.keepDbsInGraphs=db1, db2...`
  Note: string in the "skip/keep" lists is java regex patterns.
  New Table Background colors:
  - BLUE - A Database backup is in progress
  - PINK - The transaction log for this database is filled to 90%, and will probably soon be full.
  - RED - The transaction log for this database is full and users are probably suspended.
- Upgraded some of the third party libraries/jars
  - To version 4.0, Component: MIGLayout
  - To version 1.3.159, Component: H2 database
- New: Added ASE configuration to dialog 'Configure ASE for Monitoring'
  'capture missing statistics', 'enable metrics capture', 'metrics elap max', 'metrics exec max', 'metrics lio max', and 'metrics pio max' in the dialog 'Configure ASE for Monitoring'.
  Also moved this dialog to the 'tools' menu instead of 'view'.
- Add: in tab "Objects" added some columns.
  Note: this is only done if we connect to ASE CE of version 15.5 ESD#1 or above
  Added columns: `MaxPhysicalLockWaitTime, MaxTransferReqWaitTime, MaxServiceTime, AvgQueueWaitTime, MaxQueueWaitTime, MaxTimeWaitedOnLocalUsers, MaxTransferSendWaitTime, MaxIOServiceTime, MaxDowngradeServiceTime`
- New: in log4j window
  a checkbox if the window should be opened on errors, or simply stay in background
- Changed behavior: for all CM's
  Now discarding all ASE Messages with number 0, which probably is a 'print message'
  If this is not the behavior you want this can be changed from the config file, using:
  `shortCmName.discardMsgZero=true|false
  shortCmName.discardMsgZeroPrintInfo=true|false`
- Changed behavior: for all CM's
  Now discarding all ASE Messages that has to do with "in recovery" or "LOAD DATABASE"
  When databases where undergoing "LOAD DATABASE", some CM's failed with messages complaining complaining about database is offline or in recovery...
  Also the 'get ASE configuration' when connecting, complained about the same thing...
  If this is not the behavior you want this can be changed from the config file, using:
  `shortCmName.discardMsgLoadDb=true|false
  shortCmName.discardMsgLoadDbPrintInfo=true|false`
- Changed behavior: Tooltip in JTable of Performance Counters are now focusable
  By pressing F2 or by clicking in the text window. This means that you can now copy text from some tooltip windows. Especially good for Active Statements, so you can copy the showplan and SQL statements directly.
  Also moved tooltip text from the JTable to be located on the "GUI tab" headers tooltip instead
  The tooltip "describing highlighted rows" in the JTable was simply disturbing and was hiding the performance counters.
- Changed behavior: Tools->SQL Query Window
  - Added Syntax Highlight to the query text.
  - Simple code completion for some basic commands where added. (Ctrl+Space)
  - Show "what" SQL statement you are executing in a pop-up.
    The pop-up will disappear when first result set arrives.
    This makes it easier to see what is happening when executing statements via pop-up menu ("right click") on JTables, for example some commands does take a substantial time, then we want to know what has been sent to the server.
- Changed behavior: Tools->Capture SQL
  If config "plan text pipe active" wasn't enabled, a message window was displayed asking you to reconfigure. Now: This reconfigure message will only appear if you have selected the checkbox 'Sample showplan text'.
- Bug fix: Open an empty offline database gives strange error messages.
  When connecting to an offline database, I simply check if some AseMon system tables exists, if they do not exists, inform user about this and stay in the Connection Dialog.
- Bug fix: The wizard 'Create Offline Session' wrote the wrong user/password in the props file.
  And the PersistWriter class picked up the wrong password if it was encrypted.
- Bug fix: The wizard 'Create Offline Session', created empty ssh information to the offline file.
  This was done even if none was necessary, which broke no-gui mode in some cases.
- Bug fix: The RepAgent collector, used a ASE 15.x syntax, which made ASE 11.5.4.x to break.
  Solution: simply removing the optional text in: 'fetch [next from] cursor_name into @var'
- Bug fix: PersistWriter
  When a Performance Collector had no rows in it and had a Graph connected to it, we still tried to store the data, which cased some SQL syntax errors.
  This was typically for a User Defined Collector, which grabbed info from a empty "trace" table. Solution: simply don't store Graph data with no rows in them.
- Bug fix: for CMactiveStatements, adding dependant role 'sybase_ts_role'
  Also connect layer: if the user has 'sa_role' role, trying to grant 'sybase_ts_role' automatically.
- Bug fix: GetCounters thread, when checking for full transaction log in master database.
  New rule for when truncate the transaction log in master. Only if 'capture missing statistics' is enabled and number of free pages is less than 50 (100K in a 2K page server).
- Bug fix: Summary Panel, Ordering of graphs.
  In some circumstances, after reordering the graphs, we were not able to enable them again. This is fixed now.
- Bug fix: Connection Dialog.
  If 'enable monitoring' is not set, a re-config dialog will be displayed.
  If the re-config was successfully, then continue with the login.
  Previously you had to click on a bunch of windows, then "connect" again, but this is now removed.
- Bug fix: User Defined Counter.
  The wizard wrote 'sqlOpen' in the properties file, now writes 'sqlInit'.
  Is some cases the 'sqlInit' were done several times, or none.
- Bug fix: Persistent Counter Store.
  Storing AseTuen Configuration was broken.
  Now saving 'system.config', 'user.config', 'temp.config' and 'system.properties'.
- Bug fix: Performance Counter Properties Dialog
  Now works a bit better on the templates, but I need to do more here.
- Bug fix: Graph 'Number of disk operations per second'.
  The labels did not represent the correct counter, so wrong counter value was displayed for some of the labels.

## 2011-07-15

- Extended the check and save of ASE Configuration
  Now sp_helpdb, sp_helpdevice, sp_helpserver and active traceflags are also stored in the Persistent Counter Storage
  Trace flags also has a short explanation. The description are static and was extracted from ASE 15.5 The values can be viewed from the main menu -> View -> View ASE Configuration...
- Blocking Locks, Pop up
  If there were "blocking locks" in the system or "full transaction logs", a dialog pops up and asked if you want to "move" to that "tab". The decision was hard to reset...
  I added a button in the concerned "tabs" so you reset the "Move to tab" decision.
- "Offline Session Viewer" Dialog:
  - If you did "show" on a Timestamp and the parent SessionLevel had not been loaded, it will automatically be loaded in the main window. This means it will load all the graphs for that period and then position you at the Timestamp you did "show" on.
  - The right click menu on the root objects now has a menu item to check what version of AseMon that was used to save the performance counters.
  - Option "Show Counter Info". If this is checked the TreeTable also shows what Performance Counters that has been saved. A counter will display, which reflects how many records each Performance Counter has. "---" means no records.
    At the day, hour and minute level a counter "summary" will display, this will tell you how many records all the children levels has.
    Note: This will probably be redone, so I need feedback on how to solve this better.
- "Connection Dialog", tab "Counter Storage" and "Offline Connect", button "..."
  This button now opens the JFileChooser in same directory as the currently used database file.
  When you choose a new database file. The old file will be replaced with the chosen one.
  If any templates was currently selected, the JFileChooser will be opened in $ASEMON_SAVE_DIR
- Added some "internal" to the "Sample Information", which can be accessed via the tool tip
  - SQL Refresh Time - How long it took to execute the SQL statement to get Performance Counters
  - GUI Refresh Time - How long it took to refresh the GUI, including sorting the JTable
  - Local Calculation Time - Time spent in the method localCalculation()
- All tabs: Automatic Resize of Column Width, on/off
  Previously all columns width was auto resized every now and then, in many cases this caused you'r eyes to flip around on the screen, which is some cases was a bit disturbing.
  Now I'm saving the column width along with the column order, sort order etc. This means that we now can choose if we want the previous saved layout or do automatic resize of the column width.
  - In the right click menu in any Performance Counters JTable you can set what you want to do for this table, the options are 'Use Global Settings' or 'Do Auto Adjustment' or 'Use the saved column width'
  - In the MainMenu->Preferences->Auto Resize Column Width you can choose to 'Auto Adjustment' or not.
  This is especially useful when viewing AseMon recordings (offline data)
- Tab: Active Statements
  Tooltip help for HasMonSqlText and HasDbccSqlText was sometimes to wide, so now I try to format the text before showing it in the tooltip. This means, making line brakes if the output is to wide.
- Tab: Statement Cache Details
  Local Options to enable/disable 'SQL Text' and 'Showplan' results has been added.
  This was introduced so we can disable it in the case those options took to much memory in AseMon or they where using to much resources on the ASE server side.
- Tab: Objects
  Added a column TabRowCount, which simply does row_count(DBID, ObjectID), if this is to heavy, it can be disabled with the property `CMobjActivity.TabRowCount=false`.
  Note TabRowCount is only done in 15.0 or above
  Took away all the cluster columns in 15.5, if we are not connected to a cluster ASE
- Tab: Spinlock Sum
  Added records to track individual spinlocks on Data Caches (each CACHLET is now calculated)
  Added records to track individual spinlocks on Engine RunQueue (type=KERNEL-INST)
  Also a column 'type' was added, which contains: CACHE, CACHLET, DBTABLE, RESOURCE, KERNEL, KERNEL-INST, OTHER
  Let me know if it takes more resources than previously.
- New Dialog: Change 'Graph' Order and Visibility
  In this one you can change the order of the graphs in the Trend Graphs Dashboard
  The dialog can be reached from main menu: View -> Change 'Graph' Order and Visibility and from right click on any of the graphs.
- Changes to graph enable/disable
  Previously enable/disable of graphs could only be done from the Main Menu->View->Active Graphs
  Now you can right click on any of the graphs, and in the "AseMon Menu" you have options to enable and disable graphs.
  In any of the Performance Counter Tabs, in the Options Panel, top right, there is now a "graph" button. If the button is visible this Tab has Graphs attached. By clicking on the button, you can enable or disable the graphs attached to this Performance Counter Tab. Also in the "Summary" panel you have the Graph Button, right beside the label "Summary Panel", Click it to enable or disable graphs attached to the Summary Fields.
- Added one field to the Summary panel, 'Full Transaction Logs'.
  When there are databases that has full Transaction Logs, a red icon in the status bar shows up, telling you how many databases that has full transaction logs.
  If you press the icon, you will jump to the 'Databases' tab.
  In Databases Tab, databases with full transaction logs will be marked with a red background.
- Bug fix: offline connect
  If you connected to a "offline database" to view sampled performance counters, then you couldn't disconnect and connect to a new "offline database" without restarting the GUI.
  This is now fixed. Some additional cleaning up could be done like: clearing the GUI, but then latest graphs that were loaded will also be cleared. So lets wait with the "full clean" a bit...
- nogui mode:
  Added `-f | --finish` switch, which shutdown or stop the no-gui service after # hours
- nogui mode:
  Changed `-d | --dbname` switch, which specifies the offline URL string.
  `-d|--dbname` Now accepts variables `${DATE}, ${SERVERNAME}, ${ASEHOSTNAME}, ${ASEMON_HOME}, ${ASEMON_SAVE_DIR}`
  Explanation of the above variables
  - `${DATE[:format=fmt[;roll=true|false]]}`
    The DATE will be substituted with a timestamp, the format of the timestamp is specified by modifier 'format'.
    The DATE variable has modifiers, which means you can change the behaviour of the variable.
    - modifier: "`format=formatSpecification`" Is how the DATE string should be built. the specification is according to `java.text.SimpleDateFormat`, and the default value is `yyyy-MM-dd`
    - modifier: "`roll=true|false`" This means: start/create a new database if we roll over into a new DATE string. with format=`yyyy-MM-dd` a new DB will be created every midnight, with format=`yyyy-MM-dd_HH` a new DB will be created every hour. The default value for `roll` is `false`.
    The default value for `format` can be changed with in the Configuration file with property `PersistWriterJdbc.h2DateParseFormat=formatString`
    The default value for `roll` can be changed with in the Configuration file with property `PersistWriterJdbc.h2NewDbOnDateChange=true|false`
  - `${SERVERNAME}`
    The SERVERNAME will be substituted with the content of the ASE global variable `@@servername` of which ASE server we are monitoring.
  - `${ASEHOSTNAME}`
    The ASEHOSTNAME will be substituted with the output from ASE function `asehostname()` of which ASE server we are monitoring.
  - `${ASEMON_HOME}`
    The ASEMON_HOME will be substituted with the installation path of AseMon.
  - `${ASEMON_SAVE_DIR}`
    The ASEMON_SAVE_DIR will be substituted with ${ASEMON_HOME}/data or whatever the environment variable is set to.
  Example:
  `asemon -Usa -Pnull -SGORAN_1_DS -uxyz -ppasswd -shost1 -n all -i 30 -D H2 -d xxx.${ASEHOSTNAME}.${DATE:format=yyyy-MM-dd.HH;roll=true}`
  The above example, does:
  - Connects to ASE 'GORAN_1_DS' with user 'sa'
    `-Usa -Pnull -SGORAN_1_DS`
  - Host monitoring on host 'host1' with user 'xyz'
    `-uxyz -ppasswd -shost1`
  - Samples all Performance Counters
    `-n all`
  - Sample every 30 seconds
    `-i 30`
  - Use H2 as the database storage
    `-D H2`
  - H2 dbname would be 'xxx.host1.2011-05-04.19' in current path. Every hour a new database will be created.
    `-d xxx.${ASEHOSTNAME}.${DATE:format=yyyy-MM-dd.HH;roll=true}`
- Variables in URL
  The variables `${DATE}, ${SERVERNAME}, ${ASEHOSTNAME}, ${ASEMON_HOME}, ${ASEMON_SAVE_DIR}` also works in the Connection Dialog in the "Counter Storage" tab.
- Changed the name of the error log.
  For GUI mode: still ~/.asemon.AseMon.log
  For NO-GUI mode: ~/.asemon.AseMon.nogui.log
  Previously when running GUI and NO-GUI mode on same machine, they shared the error log.
- nogui mode:
  if you are using ASE to store the performance counters, then use DYNAMIC_PREPARE and do 'set statement_cache off', this for performance reasons.
  NOTE: this is only done by specifying -D and -d switches for the moment.
- "offline-read" mode
  In "offline-read" mode, the "Offline Session Viewer" dialog checks for new Samples, which could arrive in the background. A Watermark in the dialog will tell you how many new samples that has been stored since last "refresh". Background storage of Performance Counters could for example be performed by the "no-gui" process if anyone has started that module.
- nogui mode:
  Added `-r | --reconfigure` switch
  This means that even if some ASE configuration options is not set, then configure them automatically.
  Configuration names and there defaults is presented below.
  It's only configuration options with a equal sign after, which automatically can be reconfigured.

  Name | Configuration
  --- | ---
  Summary | NONE
  Objects | enable monitoring=1, object lockwait timing=1, per object statistics active=1
  Processes | enable monitoring=1, object lockwait timing=1, wait event timing=1
  Databases | enable monitoring=1
  Temp Db | enable monitoring=1, object lockwait timing=1, per object statistics active=1
  Waits | enable monitoring=1, wait event timing=1
  Engines | enable monitoring=1
  System Load | NONE
  Data Caches | enable monitoring=1
  Pools | enable monitoring=1
  Devices | enable monitoring=1
  IO Sum | enable monitoring=1
  IO Queue | enable monitoring=1
  Spinlock Sum | NONE
  Sysmon Raw | NONE
  RepAgent | NONE
  Cached Procedures | per object statistics active=1
  Procedure Cache | enable monitoring=1
  Procedure Call Stack | NONE
  Cached Objects | NONE
  Errorlog | enable monitoring=1, errorlog pipe active=1, errorlog pipe max=200
  Deadlock | enable monitoring=1, deadlock pipe active=1, deadlock pipe max=500
  Proc Cache Module Usage | NONE
  Proc Cache Memory Usage | NONE
  Statement Cache | enable monitoring=1, enable stmt cache monitoring=1, statement cache size
  Statement Cache Details | enable monitoring=1, enable stmt cache monitoring=1, statement cache size
  Active Objects | enable monitoring=1, per object statistics active=1
  Active Statements | enable monitoring=1, statement statistics active=1, wait event timing=1
  Blocking | enable monitoring=1, wait event timing=1
  Missing Statistics | capture missing statistics
  sp_monitorconfig | NONE
  OS CPU(vmstat) | NONE
  OS Disk Stat | NONE
  OS CPU(mpstat) | NONE

- SQL Tool
  The mouse wheel is now much faster when scrolling over graphs and SQL Tool Query result sets
- Upgraded some of the third party libraries/jars
  - To version 3.2.1, Component: jChart2D
  - To version 3.7.4, Component: MIGLayout
  - To version 1.3.155, Component: H2 database
  - To version 2011-05-15, Component: ProxyVole

## 2011-04-21

- New Tab: RepAgent, which is the same thing as the RepAgent section from sp_sysmon
  Note: This has dependencies on the tab 'spinlock', which does the dbcc command...
- Extended error checking when connecting to a ASE Server.
  Note: more work is needed here, but I have a hard time trying all various ASE configurations.
- Dialog "found new AseMon version".
  Now shows a HTML Pane with "What's new" (history.html)
- The Wizard pages now has a Overview page, which describes what the Wizard is good for
  Basically a Overview what the wizard does...
- Tab 'System Load':
  Added graph: 'Run Queue Length, Server Wide' averaging over all engines and instances (if it's a cluster').
  Added graph: 'Run Queue Length, Per Engine' Uses the 'Avg_1min', this so we can see the 'Run Queue Length' per engine to verify if any engine are overloaded.
  Note: this only work if we are above 15.5
- Tab 'Waits':
  I added a column WaitTimePerWait, which is the calculation of WaitTime / Waits
- Tab 'Objects':
  I added a column LockContPct, which describes the lock contention in percent
- Tab 'Devices':
  Added column 'TotalIOs', Just a summary of Read + Writes
  Added column 'ReadsPct', How much of the total IO's was reads
  Added column 'APFReadsPct', How many of the reads where Async Prefetch requests
  Added column 'WritesPct', How much of the total IO's was writes
- Tab 'Databases':
  For Cluster Edition, now calls db_recovery_status(DBID) to check if the database is undergoing node-failure recovery.
  Added column 'AppendLogContPct', how much contention in percent do we have on the Log Semaphore
  Also added a graph that shows the Log Semaphore Contention, so we can see the trend.
- Tab 'Temp Db':
  Added column 'AppendLogContPct', how much contention in percent do we have on the Log Semaphore
  Also added a graph that shows the Log Semaphore Contention, so we can see the trend.
- Tab 'Statement Cache':
  Added column 'CacheHitPct', Reuse percentage of the statement cache.
  Added column 'UnusedSizeKB', Just how much memory is free for the moment.
  Added column 'AvgStmntSizeInKB', How much memory does each of the statements take.
  Added column 'NumStatementsDiff', which simply is a duplicate of 'NumStatements', but it has difference calculations applied to it.
  Added right-click menu: - Remove ALL entries from the Statement Cache. do: dbcc purgesqlcache
  Added right-click menu: - Print Summaries of the Statements in the Statement Cache. do: dbcc prsqlcache
  Added Graph for: NumSearches, HitCount, NumInserts, NumRemovals
- Tab 'Statement Cache Details':
  Added column 'HasShowplan' and 'msgAsColValue' The associated execution plan of the SSQLID.
  Added column 'HasSqltext' and 'sqltext' The SQL Text of the SSQLID.
  Also rearranged the column order and added tooltip.
  Added right-click menu: - Remove ALL entries from the Statement Cache. do: dbcc purgesqlcache
  Added right-click menu: - Remove A Specific ${SSQLID} from the Statement Cache. do: dbcc purgesqlcache(${SSQLID})
  Added right-click menu: - Print info about the Statement ${SSQLID}. do dbcc prsqlcache(${SSQLID}, 1)
- Tab 'Proc Cache Module Usage':
  Added column 'ActiveDiff', which simply is a duplicate of 'Active', but it has difference calculations applied to it.
  Added a graph, which displays the Active count for each module, so we can track this for a longer time. When I did this I also needed to implement a minimum size of the graph panel (since I wanted this graph larger than the defaults), which also lead to a right-click menu on the graph's panel so we can set a new minimum size on all the graph panels. Unfortunately to reach the menu you need to right-click at the very bottom of the graph panel (below the series labels)
- Tab 'Proc Cache Memory Usage':
  Added column 'ActiveDiff', which simply is a duplicate of 'Active', but it has difference calculations applied to it.
- Added more explanations to the MonWaitEventIdDictionary.
  'Comments' and 'Most Common Cause' was used from the document: Managing Workloads with ASE: Techniques for OLTP Scaling and Performance Management with Large SMP and Shared Disk Clusters
  which you can get from: http://www.sybase.com/detail?id=1091630
- Added some Menu shortcuts, connect, disconnect etc...
- Basic Operating System Monitoring capabilities
  Three new Tabs has been created for this:
  - `OS Disk Stat` which uses iostat or vmstat to get OS disk statistics
  - `OS CPU(vmstat)` which uses vmstat to get OS overall OS statistics
  - `OS CPU(mpstat)` which uses mpstat to get OS statistics per CPU
  The 'Operating System Monitoring' subsystem is using a SSH (Secure Shell) connection to remote host. In that SSH connection we can kick of the various OS Commands and receive the output (see below for more details)
  Below is a breath description of the subsystem
  - What is this Basic Operating System Monitoring.
    If you want to monitor the Operating System with some basic command, this is one way you can do it.
    And also if you are storing the Performance Counters in a Persistent storage, the OS Monitoring is in sync with
    the Performance Counters from the monitored ASE Server, which makes it easier to correlate the various metrics.
  - What OS Monitoring Commands are supported for the moment.
    The basic command which for the moment is supported is:
    - `iostat`
    - `vmstat`
    - `mpstat`
    If you are using Veritas as the Disk IO subsystem and want to sample disk statistics with vxstat and not iostat.
    Make sure vxstat is executable and in the $PATH off the user that you're connecting to the Operating System with.
    Then it will execute vxstat instead of iostat and use that information.
  - But every Operating System work slightly different.
    But all Operating Systems has different layouts for the various commands.
    For Example 'iostat' does not produce the same output on Solaris as it does on Linux.
    When a connection to the OS made, It will try to identify what OS were connecting to (by using uname -a) and then use OS specific parsers.
    This implies that a \"parser\" is implement for every OS.
    So if you are getting errors, faulty output or that your OS is not supported, please notify me and I will try to fix it.
    Also if you want to change the parameters/flags to the OS Commands, to get better Performance Counters, kick me and I'll fix it!
    The only thing that can change by ourself is the OS Commands sleep interval
    This is done by adding the below information to the configuration file. (asemon.properties)"
    - for iostat: `MonitorIoSolaris.sleep=5`
    - for mpstat: `MonitorVmstatAix.sleep=5`
    - for vmstat: `MonitorMpstatLinux.sleep=5`
    You can probably fill in the blanks... `[Monitor][Subsystem][Osname].sleep=[samplePeriodToTheCommand]`
    If you need to debug or check what the OS Command is sending, you can add the following to the Configuration file:
    `log4j.logger.asemon.hostmon.HostMonitor=DEBUG`
    Or you can use the 'log viewer' to change the 'log level' while AseMon is still running:
    MainMenu->View->Open Log Window..., then Press 'Set log level'... locate asemon.hostmon.HostMonitor and change it.
  - The big picture of how it's implememted.
    The way it's implemented:
    - Start a background task that executes for instance 'iostat' every 2 seconds (iostat -xdz 2) or whatever sample period (see section above).
    - Parse the output from the OS Command and store it in a intermediate in-memory storage.
    - Then when AseMon think it's time to sample some Performance Counters (depends on AseMon's sample time)
      The subsystem does an average calculation on the intermediate stored values and then resets the intermidiate storage so that new samples from the OS Command can be sampled.
    - Now the Performance Counters or values are available to view in AseMon.
    For 'vmstat' I choose a slightly different approach, this since 'vmstat' is only delivering one row per vmstats-sample period.
    So in this case I do not do a summary or average calculation.
    Instead I simply displays all the sampled records I have received from the command with a 'timestamp' column to indicate when it was received.
    If you instead want to have some kind of average or summary, please notify me and explain...
  - What to expect in upcomming releases of AseMon.
    In current release there are limited support for User Defined OS Monitoring, which you can add to the Configuration file
    In future release, the plan is to add a Wizard where you can add User Defined Host Monitor Counters and maybe support for diff/rate counters as well.
    With a Used Defined OS Monitoring you could for example Monitor Outputs from your Application Server or in whatever way you think is's usable.

        #-------------------------------------------------
        # Example of a simple file list
        # isStreaming=false, means that it's executed at every AseMon sample interval
        #-------------------------------------------------
        hostmon.udc.TestGoransLs.displayName                   = List of files in $HOME
        hostmon.udc.TestGoransLs.description                   = This would be the tooltip help on the Tab for: List of files in $HOME
        hostmon.udc.TestGoransLs.osCommand                     = ls -Fl | egrep -v '^d'
        hostmon.udc.TestGoransLs.osCommand.isStreaming         = false
        hostmon.udc.TestGoransLs.addStrColumn.umode            = {length=10, sqlColumnNumber=1,  parseColumnNumber=1,  isNullable=false, description=xxx}
        hostmon.udc.TestGoransLs.addIntColumn.files            = {           sqlColumnNumber=2,  parseColumnNumber=2,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.owner            = {length=10, sqlColumnNumber=3,  parseColumnNumber=3,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.group            = {length=10, sqlColumnNumber=4,  parseColumnNumber=4,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addIntColumn.sizeInBytes      = {           sqlColumnNumber=5,  parseColumnNumber=5,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.date             = {length=10, sqlColumnNumber=6,  parseColumnNumber=6,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.time             = {length=5,  sqlColumnNumber=7,  parseColumnNumber=7,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.filename         = {length=99, sqlColumnNumber=8,  parseColumnNumber=8,  isNullable=true,  description=xxx}

        #-------------------------------------------------
        # Example of mpstat
        # isStreaming=true, means that it's executed once, and a background thread parses the output stream from the command
        #                   and on each AseMon sample interval, a average calculation is done on the sampled records.
        #                   numOfSamples is an counter indicator, which reflects how many sampled records the average is based on.
        #-------------------------------------------------
        hostmon.udc.TestGoransMpstat.displayName               = UD Mpstat
        hostmon.udc.TestGoransMpstat.description               = This would be the tooltip help on the Tab for: UD Mpstat
        hostmon.udc.TestGoransMpstat.osCommand                 = mpstat -P ALL 1
        hostmon.udc.TestGoransMpstat.osCommand.isStreaming     = true
        hostmon.udc.TestGoransMpstat.addStrColumn.CPU          = {length=30,             sqlColumnNumber=1,  parseColumnNumber=3,  isNullable=false, description=Processor number. The keyword all indicates that statistics are calculated as averages among all processors.}
        hostmon.udc.TestGoransMpstat.addIntColumn.numOfSamples = {                       sqlColumnNumber=2,  parseColumnNumber=0,  isNullable=true,  description=Number of 'sub' sample entries of iostat this value is based on}
        hostmon.udc.TestGoransMpstat.addStatColumn.usrPct      = {precision=10, scale=1, sqlColumnNumber=3,  parseColumnNumber=4,  isNullable=true,  description=Show the percentage of CPU utilization that occurred while executing at the user level (application).}
        hostmon.udc.TestGoransMpstat.addStatColumn.nicePct     = {precision=10, scale=1, sqlColumnNumber=4,  parseColumnNumber=5,  isNullable=true,  description=Show the percentage of CPU utilization that occurred while executing at the user level with nice priority.}
        hostmon.udc.TestGoransMpstat.addStatColumn.sysPct      = {precision=10, scale=1, sqlColumnNumber=5,  parseColumnNumber=6,  isNullable=true,  description=Show the percentage of CPU utilization that occurred while executing at the system level (kernel). Note that this does not include time spent servicing hardware and software interrupts.}
        hostmon.udc.TestGoransMpstat.addStatColumn.iowaitPct   = {precision=10, scale=1, sqlColumnNumber=6,  parseColumnNumber=7,  isNullable=true,  description=Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.}
        hostmon.udc.TestGoransMpstat.addStatColumn.irqPct      = {precision=10, scale=1, sqlColumnNumber=7,  parseColumnNumber=8,  isNullable=true,  description=Show the percentage of time spent by the CPU or CPUs to service hardware interrupts.}
        hostmon.udc.TestGoransMpstat.addStatColumn.softPct     = {precision=10, scale=1, sqlColumnNumber=8,  parseColumnNumber=9,  isNullable=true,  description=Show the percentage of time spent by the CPU or CPUs to service software interrupts.}
        hostmon.udc.TestGoransMpstat.addStatColumn.stealPct    = {precision=10, scale=1, sqlColumnNumber=9,  parseColumnNumber=10, isNullable=true,  description=Show the percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.}
        hostmon.udc.TestGoransMpstat.addStatColumn.guestPct    = {precision=10, scale=1, sqlColumnNumber=10, parseColumnNumber=11, isNullable=true,  description=Show the percentage of time spent by the CPU or CPUs to run a virtual processor.}
        hostmon.udc.TestGoransMpstat.addStatColumn.idlePct     = {precision=10, scale=1, sqlColumnNumber=11, parseColumnNumber=12, isNullable=true,  description=Show the percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request.}
        hostmon.udc.TestGoransMpstat.setPkColumns              = CPU
        hostmon.udc.TestGoransMpstat.setPercentColumns         = usrPct, nicePct, sysPct, iowaitPct, irqPct, softPct, stealPct, guestPct, idlePct
        hostmon.udc.TestGoransMpstat.setSubSampleColumn        = numOfSamples
        hostmon.udc.TestGoransMpstat.setParseRegexp            = DEFAULT
        hostmon.udc.TestGoransMpstat.skipRows.CPU              = CPU
        #--------------------------------- OK, lets attach a graph to it as well
        hostmon.udc.TestGoransMpstat.graph=true
        hostmon.udc.TestGoransMpstat.graph.type=byRow
        hostmon.udc.TestGoransMpstat.graph.name=mpstatGraph
        hostmon.udc.TestGoransMpstat.graph.label=MpStat Graph
        hostmon.udc.TestGoransMpstat.graph.menuLabel=MpStat Graph
        hostmon.udc.TestGoransMpstat.graph.data.cols=idlePct
        hostmon.udc.TestGoransMpstat.graph.data.methods=absVal
        hostmon.udc.TestGoransMpstat.graph.data.labels=-pk-

- Configurations will now be get from several Configuration files
  The search order is USER_TEMP, USER_CONF, SYSTEM_CONF: so if you save something in your private files it will override the System configuration.
  The default configuration files are: USER_TEMP='$HOME/.asemon/asemon.save.properties', USER_CONF='$HOME/.asemon/asemon.user.properties', SYSTEM_CONF='$ASEMON_HOME/asemon.properties'
- Added some command line options, -D for shortcut ASE/ASA PCS storage.
  Also fixed some issues for PCS when storing data in ASE and ASA
  Fixed the "check for new sample values", this is useful when: reading a Persistent Storage from the GUI, while at the same time someone (probably the no GUI mode) is applying data to it.
- Restricted GUI mode when "time to live" has expired.
  When "In Development Version" and "time to live" has expired, the GUI will still be able to start, but a very restricted environment is available. Only: Persistent Counter Storge - Read (offline read) will be available.
  This 'start' option was implemented as a fail-safe mechanism, and should only be used if the new AseMon version is not capable of reading the old database. In 99.9% the new AseMon version will be able to read Performance Counters stored by a earlier AseMon release.
- Added "Pre Defined SQL Statements" in the main menu: tools->Predefined SQL Statements
  In here there is a bunch of SQL Statements that can help you...
  You can add you'r own statements in the "user" properties file "$HOME/.asemon/asemon.user.properties"
  The `01` and `02` is used to specify in what order in the menu they should be presented.

      # Do some SQL
      user.predefined.sql.01.name                      = xxx - select something, bla bla bla
      user.predefined.sql.01.execute                   = select NOW=getdate()

      # Execute your stored proc, if the proc isn't installed, install it using the file.
      # needsVersion is if it containes SQL that is onlky valid from a specific version of ASE (specified as 15032, for 15.0.3 ESD#2, should always be 5 numbers)
      user.predefined.sql.02.name                      = sp__xxx - my own proc...
      user.predefined.sql.02.execute                   = exec sp__xxx
      user.predefined.sql.02.install.needsVersion      = 0
      user.predefined.sql.02.install.dbname            = sybsystemprocs
      user.predefined.sql.02.install.procName          = sp__xxx
      user.predefined.sql.02.install.procDateThreshold = 2011-04-14
      user.predefined.sql.02.install.scriptName        = C:/tmp/sp__xxx.sql
      user.predefined.sql.02.install.needsRole         = sa_role

- Swing Event Dispatch Thread (EDT) debuging...
  If the GUI seems a bit slow or unresponsive, you can turn on a debug option -x EDT_HANG
  Then you will get stacktraces when EDT runs into deadlocks and when a single execution on the EDT takes to long... This will simplify debugging and fixing GUI issues in the future.
  Turn this on with: -x EDT_HANG
  Check available debug options: -x list
- bug fix:
  if a Graph was indicated as "non visible" on creation, the option "Enable background data polling" in the Performance Counter Tab was disabled, which ment that we couldn't enable BG mode without first "enable and disable" the graph attached to this CM.
  Now I wont change the background property, I will simply show a label in the right corner of the "options" panel, that says "has active graphs", if any graphs is active for this Performance Counter.
- Made some changes to dependant Performance Counters and how they do refresh
  A bit less messages in the error log, and better GUI watermarks for when next refresh should happen.
- bug fix: SQL Capture tool
  When to sample data in the tabs 'Object', 'Waits' and 'Locks' did not work to 100%
  Now it works as it does in the Main window.
- Using ant to make final distribution
  The distribution is not using aseman.jar as it's compiled source (classes dir is just there for development)
  asemon_YYYY-MM-DD.zip does not contain the asemon subdirectory anymore. So unpacking has changed slightly
- Also a bunch of small changes not mentioned in this doc.

## 2011-01-12

- The work to port to Java Generics has been started...
- Splash screen when starting.
- Check for Java 6 version is done prior to starting asemon (in that bat/sh file)
  This because in java 6, we are using the splash screen option, which is not available in earlier releases on java. If the version control is done later, then we will receive an error that the command line switch '-splash' is unknown...
- When switched to Java 1.6 and JXTable 1.6.2, the below started to happen:
  When rows are deleted from a JTable, in some cases it used the "deleted" view row from the table to get cell values for rendering in some cases.
  I don't know why this is happening, but it seems to happen in some repaint scenario when I have highlighters (in JXTable) + a bunch of more stuff...
  A lot of the faults has been removed, but some are still left...
  A ';' sign is printed to the standard output every time it happens. This just to notify me in the future, that the problem still exists...
- Tab: active statements
  Added 2 columns 'HasMonSqlText' and 'MonSqlText', which does:
  select SQLText from master..monProcessSQLText where SPID = <SPID>
  This will show the current running SQL Statement, this will then also include SQL statements that has been executed via dynamic SQL inside a Stored procedure. exec('do SQL here'). In some cases/versions it's not showed by DBCC sqltext().
  It will also help you to validate if the SQL statement is still running. Info from the monProcessSQLText only has rows if the statement is still running, while DBCC sqltext will show you the last executed SQL statement, which is still left in the PSS structure.
- Tabs: Process, Active Statements, Blocking
  On SPID's that are blocked: Changed default color to PINK (almost read)
- In Memory History: the history time can now be set lower than the Graph History
  A Spinner on the right of "Graph History in Minutes" is now available...
  To access the "in memory history", press the "DB magnifyingGlass" icon on the toolbar.
- Cell renders has been changed to format numbers in a better way.
  Spaces between "large" numbers for readability.
- Multiple column sorts can now be done (current implementation supports 3 columns).
  The column header, has a indicator that tells you if the sort is done Ascending, Descending or Unsorted. The indicator also tells you if this column is the first, second or third column in the sort.
  Initial Sort order (first click) has also been changed to Descending, so that high numbers is at top, because this is what we normally want to sort at.
- Storing and Restoring of JTable Column Order, Visibility and Sort Order now works better.
  Especially when viewing offline and in-memory data.
- Now also storing/restoring the filter panel on asemon restarts.
  Also applying the filters when changing between different data samples in the offline mode. also works when changing between InMemory view and Regular Online view.
- Tab: Active Statements
  Previously the MultiSampled flag was raised when the SPID was present between two samples.
  Now that check also includes in the StartTime for the statement is the same.
- ASE Configuration (both sp_configure, sp_helpcache and sp_cacheconfig) are stored in the Persistent Counter Storage (a offline database) when asemon starts.
  The configuration can be viewed from the GUI when reading the offline database.
- New Tab: Procedure Call Stack
  This will show the nesting level of how the procs/triggers/views are executed.
  This could be used as a small profiler, to check what procedure stack is currently executing, but to make it into a better profiler this needs to be sampled *often*, which might not be a good idea...
- New graphs:
  - CPU Summary using global variables @@cpu_busy, @@cpu_io (depends on tab 'Summary')
  - Number of transactions (only in ASE 15.0.3 ESD#1 and higher) (depends on tab 'Summary')
  - Number of Connections/users that are connected to the ASE (depends on tab 'Summary')
  - Disk read/write per second using global variables @@total_read, @@total_write (depends on tab 'Summary')
  - Network Packet read/sent per second using global variables @@pack_recv, @@pack_sent (depends on tab 'Summary')
  - Checkpoint and Housekeeper Writes per second (depends on tab 'Processes')
  - Number of Procedure Requests per Second (depends on tab 'Procedure Cache')
- Tab: Engines
  in ASE 15.5 the column 'IO CPU Time' was added to the monEngine table...
  Start to use that one, otherwise the percentage calculation will be wrong.
- Number of tabs has started to be a factor... it becomes harder to navigate between them.
  So now you can hide tabs that you are not using, or simply reorder the tabs to suit your usage of asemon.
  Right click on any tab, and choose 'Tab Options', in here you can personalize the tabs a bit.
  Or from the main menu: View -> Change 'Tab Titles' Order and Visibility
  The second thing that has been done on tab navigation is: on the toolbar two new buttons has been added where you can Activate (jump to) a specific tab. One button is in the original order, the second button is sorted on the tab title name.
- New Tab: sp_monitorconfig
  This simply executes the procedure sp_monitorconfig, which could be handy to have
  Recommendation is to have the 'postpone' field set to 600 (10 minutes or so), so we do not sample this that often.
- Saving the active graphs in the Summary panel, did not work, fixed that...
  So now after a restart I remember what graphs was active or disabled.
- File Location changes:
  Temporary GUI save settings file (asemon.save.properties), "screen capture" files and log files directory has been moved from ($HOME) to ($HOME/.asemon)
- When the expire date for the in-development release a GUI pop up is showed.
- Tab: Processes
  The local option "Show System Processes" did not work on some ASE versions, this was fixed
- Tab: Active Objects: In some cases (for example "self joins"), the object/table was presented several times by the MDA tables, which caused this tab to fail.
  This has been fixed in the following way: if several rows with the same PK is found, and we have a column that is named 'dupMergeCount', we simply merge the previous found row with the current one (simulate a sum()) and increment the column 'dupMergeCount', the last thing is done just to specify how many rows we actually merged into this row.
  If 'dupMergeCount' is above 0, then we will have several rows summarized into this row.
- Command line parameters: A couple of new ones has been introduced
  For example: -U user -P passwd -S server -s sampleTime -d h2dbname
  These switches is mainly for the --noGui option (override values in the noGui config file)
  If you have not produced a noGui config file via the "offline wizard" you can now choose to specify --NoGui small|medium|large|all, which collects a predefined subset of Performance Counters into the Persistent Counter Storage.
  If you want full control over what to collect, please use the "offline wizard" to specify what Performance Counters that should be collected.
- Tab: Blocking
  Fixed so that it can contain multiple PK (this since no difference calculations is done in this tab)
- The pop up dialog informing you about "out of memory" situations, now the OK button works to close the window
- The tooltip on column header does not work in offline mode.
  The solution was to store the MDA help dictionary stuff in the offline database, and read it in again when connection to a offline database.
- In earlier releases the ESD level was reset to 0 or 1 when it was over 9
  Now the max ESD level is keept at 9, so even if you running ESD#10 it will show as #9 in the internal integer holding ase version.
  This will be redone in later some later release, using better granularity of the version number.
  Also ESD number handling was changed in some release to support "sub ESD levels", so a @@version string can now look like (Adaptive Server Enterprise/12.5.4/EBF 15400 ESD#7.1/P/...)
  The parsing for this does now work, but I do not keep track of the ESD sub level.
- Tab: Cached Procedures
  Now has a Icon, which tells you what type of object it is (rule, view, trigger or procedure)
- When asemon connect to ASE it puts the asemon version into the sysprocesses.host field
- Tab: Active Statements
  new option: get procedure call stack, which also gets the procedure call stack from the table monProcessProcedures
- SQL Window Tool, add icon so it's visible in the "taskbar" in windows.
  This makes it easier to navigate between many different SQL Windows...
- When in the in-memory view, the previous versions still updated the 'Summary' panel.
  This is not done anymore.
- A Dummy/Demo test application has been made, so you can "simulate" workload towards an ASE Server and train yourself how to use asemon.
  This is the file perfdemo.bat
  To be able to use this you must install a test/demo database, see README.txt and DO_DEMO.txt in classes/asemon/perftest/sql for more information
  My intention was not to release this application, I created it simply to do "dummy load" on the ASE server during a customer demo that I gave, but you might also be able to use it, please give me some feedback if it should be included in the package or if I should be deleted.
  So the README.txt and DO_DEMO.txt files are just my internal notes...

## 2010-10-29

- Changed to Java 1.6, so I wont support JVM 1.5 anymore...
  The change to 1.6 was needed for the new SwingX (JXTable etc) 1.6.2 (went from 1.0 to 1.6.2)
- A first attempt to store column order and restore that order after restart.
  This will most likely fuckup some other stuff where I don't convert viewToModel, but it's a first attempt...
  Also storing the sort order and restores that.
- Also added some 'restore column order' and some other stuff into the right click menu on Counter Model tables.
- Changed from JChart2D 3.1.0 -> 3.2.0
  Changed the tool tip to be on 2 rows, showing "Label: value\n Time: time"
- A first attempt to save and load the filter (Column, Operation, Value, NoZeroCounters)
- When moving around using the arrows key on the keyboard on the in-memory and offline slider caused the system to update the view on every keystroke. This overloaded the system when holding down the arrow key. So I added timers of 100ms, which means that loading of data is done when no input has been given for 100ms.
- Using proxy-vole (http://code.google.com/p/proxy-vole) as a automatic proxy resolver when checking updates or doing other http requests.
  For example this means that if the client is using a proxy server when doing internet/web lookups, the client can now use the PAC file in IExplorer or Firefox to figgure out what proxy server to use. (PAC=Proxy Auto Config. http://en.wikipedia.org/wiki/Proxy_auto-config)

## 2010-06-22

- New version of the H2 database is used: 1.2.135 (2010-05-08)
  This version supports embedded BLOBS in the database, so no extra directories for blobs will be created
- Tab: Processes & Active Statements
  Added column 'WaitClassDesc', which is the class description for the WaitEventID
- Tab: Active Statements
  - Added column 'multiSampled', which is 'YES' if the PK (SPID, monSource [,InstanceID]) was visible in the previous sample as well
  - Added column 'pssinfo_tempdb_pages' to check how many tempdb pages this SPID is currently using
  - Added column 'tempdb_name' to check what tempdb this SIPD is using
  - Stacktrace, which is deferred to the localCalculation() method is not executed if the WaitEventID has changed.
  - Tooltip on sqlText is not adding extra newlines, which made large outputs a bit unreadable
  - Also marked the 'multiSampled' rows with the color 'ORANGE'
  - InMemoryHistory: Is now showing the checkboxes and tooltip for Active Statements
- Tab: Cached Objects
  Changed default postponeTime to 600, every 10 minutes
- Tab: Blocking
  Is now only available for ase servers over version 15.0.0 ESD#2
- Tab: System Load
  Rearranged the column layout to make it a bit more readable
- Dialog: CheckForNewUpdates
  Now doing a better job of remembering the checkbox 'do not show this again'
  And some better text descriptions...
- Dialog: ConnectionDialog
  For the 'offline read', you can start the H2 as a network server
- in 'offline read' mode, I added 'Fast Forwad' and 'Rewind' buttons, which goes to the next sample time that has data for this tab. It's especially good in 'Active Statement' and other tabs where data is not always present, for example if you have the 'postpone time' set...
  The Buttons are located in every tab in the 'Sample Information' panel.
- Added a "rowcount" label to indicate how many rows there are in the JTable.
  It's located "Show Counter Type" panel
- Some changes how data is displayed in the 'offline read' if data can't be found for the selected sample period
- Connection dialog:
  in tab 'Counter Storage', Changed the layout of the panel/JTable "What Counter Data should be Persisted"
- Offline wizard:
  in page 3 'What should be offline sampled', Changed the layout of the panel/JTable
  And added the button "Set to Template", so we can reuse what we are currently doing in the GUI.
- Upgraded to latest H2 version, 1.2.137 (2010-06-06)

## 2010-04-27

- A bunch of bug fixes and improvements not listed here
- Tab: Processes
  The choice to disable sampling of "system threads".
  In ASE Cluster Edition, there are a bunch of system threads/SPID's, which could blur the vision in this tab.
  For now; this was implemented using SQL, but in the future it might very well be a "filter" option instead. Then we would still benefit from the "Persistence Counter Storage" to store all threads in the database (if we were using that), but when later when viewing data we could filter them out in the GUI.
- Query Window:
  When doing "ctrl-c" to copy into the clipboard in some places the new-line was not copied.
  A "copy" button was also implemented that takes "all" the objects in the result set output and put it into the clipboard, JTables are coped into ASCII tables. keys: F5, F9 are now shortcuts to execute SQL, this to emulate dbisql
- You can now Pause all data collection by pressing the 'Pause icon' on the tool bar or the 'Pause Icon' in the status field. To resume data collection, just press the same icon gain, which now will have a 'Play icon'.
- Added dbcc pss(0, ${SPID}, 2) on the right click in all tables.
- Tab: Engines
  Only select records from monEngines with the Status 'online'.
  Also a new column 'IOCPUTime' was added if you're above ASE 15.5 and 15.0.3 CE
  NOTE: it's currently not part of the percentage calculation.
- For ASE Cluster Edition, remember the system_view settings (cluster or instance)
  The system view can be changed in the 'Summary' tab if you are connected to a ASE CE.
- Login dialog: when pressing enter in the password field and all the mandatory fields are filled in a login is attempted (same as pressing OK button).
- Screen shots can now be made from a button on the tool bar, using the "Camera icon".
  It will produce a JPG file in the "home" directory.
- Tab: Objects when we are in 15.5 and 15.0.3 CE, I have added a bunch of new columns, mainly for Cluster Edition measurements...
- In the 'Summary' tab I also grabs @@connections and an 15.5 or 15.0.3 CE I also get Transactions from the monState table. (in CE the Transactions columns does not seem to work in a good manner)
- When there are blocking spid's, a red icon in the status bar shows up, telling you how many spid's that are currently blocked. If you press the icon, you will jump to the 'Blocking' tab.
- If you're running out of memory, I will try to clear all in memory history and do Garbage Collection. After the GC hopefully enough memory will be available to continue.
  TODO: I show a blocking message, this needs to changed into a non blocking message.
- An all tabs: a User Defined SQL statement for tool tip on cell content can be added
  This is done in the config file, example:
  table.tooltip.SPID=select * from sysprocesses where spid = ?
  table.tooltip.CMprocActivity.SPID=select suser_name(suid) from sysprocesses where spid = ?
  The first config would execute SQL and show the result set as a tool tip in all tab's
  The second will override the default when you are in tab 'CMprocActivity'.
  For SPID there is a default tool tip that shows some info from monProcess
- Tab: Active Statements
  A spid that holds blocking locks, may not always be visible in monProcessStatement
  For example id you in isql do 'begin tran; insert into t1 values(1); go', the spid will be in status 'waiting for incoming network data' and not really active.
  There for I introduced two set of rows 'ACTIVE' and 'BLOCKER', the 'ACTIVE' originates from monProcessStatement, while 'BLOCKERS' are spid's that blocks others from working. Both the 'ACTIVE' and the 'BLOCKER' can be visible in the table.
  Also added 'dbcc stacktrace' of all spid's visible in this table
  The ability to disable 'showplan', 'sqltext' and 'stacktrace' can be done from the GUI and is written to the user settings temporary property file as 'CMActiveStatements.sample.showplan=false, CMActiveStatements.sample.dbccSqltext=false, CMActiveStatements.sample.dbccSqltext=false'.
  Also added column 'BlockingOtherSpids' which is a list of spid's that the current spid is blocking, and by the way, rows/spid's that blocks other will be marked with the color red.
- bugfix: User Defined Counter wizard, name checking was partially faulty.
  Name can now only be a-z, A-Z, 0-9 and not starting with CM.
- Added 'needRole' to CounterModel and UserDefinedCounterModel, which will be checked just as 'needConfig' and show errors on the 'tab' if you are not authorized to view the 'tab'.
  Also added a bunch of stuff so that non 'sa' users can use the tool as well.
- Better support for command line switches. This is now done in java instead of the bat or shell script that starts asemon.
- Made changes in the ConnectionDialog to support JDBC options + a JdbcOptionDialog where you can choose from the JDBC driver provided options. Or simply type them in manually
  Also multiple host:port are fetched from the sql.ini/interfaces file and can also be typed in manually. However jConnect doesn't seem to like it...
  If the information which is you can switch to use the "raw" URL mode instead, check the 'Use URL' check box, then the URL text field will be used when connection. By pressing <enter> in the field the URL text will be parsed and transferred to the above disabled fields.

## 2010-02-22

- Added "sp_showplan" and "dbcc sqltext" in tab 'Active Statements'.
  The full showplan text is displayed using tool tip. Or copy the table using right click 'copy table to clipboard'.
- Added 'Data Type' in the Create 'User Defined Counter' Wizard.
  If it's not a number datatype, the column can't be chosen as a 'diff' counter
  Also added some checks in the Graph part, so that we can't continue, if wrong method type is chosen (if diff is not on, only absolute methods can be chosen)
- Table Cell background color can be customized in the properties file, defaults are:

      	CMobjActivity.color.index     = ORANGE

      	CMprocActivity.color.system   = YELLOW

      	CMprocActivity.color.running  = GREEN

      	CMprocActivity.color.blocked  = ORANGE

      	CMprocActivity.color.blocking = RED

      	CMcachedObjects.color.index   = ORANGE

      	CMActiveObjects.color.index   = ORANGE

      	CMblocking.color.blocking     = RED

- Changed Copy + Paste handling from the JTable
  Which means I added 'Copy Cell', 'Copy Row' and also added 'Copy Table as Ascii-table'
- If you are on a slow connection to the dataserver, it will now work faster.
  I removed a lot of extra calls to Connection.isClosed(), which issues 'exec sp_mda 0,7' to check if the connection is alive or not. I simply cached the check for X milliseconds.
- The QueryWindow now has a ScrollPane/SplitPane for the SQL Text as well.
  When the window is opened the size of the SQL Text is "calculated" to a proper size for that specific SQL Batch.
  Also added 'Copy table/row to clipboard' in the jtable popup menu

## 2010-02-14

- Asemon now works with ASE Cluster Edition
  The column InstanceId has been added in the case we connects to a Cluster Enabled ASE. Some extra information is also displayed in the 'Summary' tab. In this panel you can also choose if you want to view counters for the whole cluster or just the instance which asemon is connected to.
  Specific Counter Tab's will probably added later on, but for now create you'r own Cluster Specific counters using the wizard 'create User Defined Counter', please send you'r best Cluster Edition Counters to me so I can implement them for everyone.
- Added Counter tab 'Sysmon Raw' which works in peer with 'Spinlock Sum'.
  This counter is in extreme first version, and just reads the values that was left over from the 'Spinlock Sum' counter tab. No enrichment of the data has be done so far, so it's just the "raw" counters that the sp_sysmon is using.
  In the future a sp_sysmon look alike can be done (lets use a JXTreeTable for that).
- A better implementation of the indicator icon, now the Icon on the Tab is repainted or replaced with a 2 pixel larger icon that has a green stripe on the left side of the icon.
  Thanx Reine Lindqvist
- A new Counter Tab 'Blocking' that shows information about SPID's that are involved in a normal 'blocking lock' situation.
  This was also done by Reine Lindqvist
- change to the tab 'Blocking' when we have blocking SPID's
  If 'Lock Waits' counter in the 'Summary' panel is above 0, an popup will ask you if you want to set the 'Blocked' tab as the active tab.
- Color coding on some Counter tabs
  tab - 'Objects': ORANGE = This is an Index
  tab - 'Cached Objects': ORANGE = This is an Index
  tab - 'Active Objects': ORANGE = This is an Index
  tab - 'Blocking': RED = when column 'Blocked State' == 'Blocking'
  tab - 'Processes': RED = when 'SPID' is Blocking other SPID's
  tab - 'Processes': ORANGE = when 'SPID' are Blocked by other SPID's
  tab - 'Processes': YELLOW = when 'Login' is empty, meaning it's a ASE SYSTEM thread/spid
  tab - 'Processes': GREEN = when 'status' is in 'running' or 'runnable'
- Added Java version check when asemon starts. has to be 1.5 for the moment.
- bugfix: on 'Processes' Tab, when not case sensitive sort order, the problem 'Ambiguous column name spid' was raised.

## 2010-01-28

- Implemented "offline" reader
  This means that we now can read data from a database into the GUI, the data has previously been stored by asemon into that database (Persistent Counter Storage).
  The sampled data could have been stored by the "non gui" mode or by the GUI itself, and viewed at a later time.
  This functionality also enables us to have one "no gui" asemon that stores the data in the Persistent Counter Storage and many asemon GUI's that views the data.
  That is if several dba's wants to view the same data without having several asemon GUI's that each individually issues SQL statements to collect data.
  Please I need feedback on how this is working...
- A green "line/stripe" at the right hand side of the tab on the TabbedPane, which indicates that there are sampled data under that tab.
  This needs rework, because it overwrites menu items, tool tip and other components that are displayed on top of the "stripe" indicator.
- In the Persistent Counter Storage, you can now choose if you want to store all data or just some of them, you can choose to store Absolute, Diff or Rate Counters in the data store.
  There are check boxes for this in each counter panel and also in the Wizard that creates an file for the off line storage.
- If we loose the database connection to the monitored server in GUI mode, it tries to automatically reconnect if the option is set in the Connection dialog.
- Menu->view->Set Counter Set Parameters
  Is a new Dialog where you can change most of the options that is normally located under each "tab". This means that you do not have to click around so much when you want to change some option under all the various tabs.
- The graphs are now zoomable. Just drag the mouse over the are you want to zoom in on. Right click and do "zoom out" when you are done.
- When creating a offline session file from the wizard, the passwords are now encrypted.

## 2009-11-23

- 'Deadlock' and 'Errorlog' tabs now works again.
- two new tabs 'System Load' and 'Temp Db'
  'System Load' needs ASE 15.5 or higher and shows information from the monSysLoad, which can help you determine how long the "run queue length" is. Which is almost the same as 'load average' on Unix systems. 'Temp db' shows you various information about tempdb usage.
- The filter now also works for 'Deadlock' and the 'Errolog' tabs
- 'Diff' and 'Rate' counters choice panel are now disabled if there are no diff columns specified
- introduced 'needAseVersion' and 'needAseConfig' for all CM's
  This means it's easier to specify lowest ASE version for this "tab" to start work. The same goes for configuration.
  If version or configuration is not satisfied a "watermark" text on the tab will show what was wrong.
- In all tabs, a new time option were introduced, the 'postpone'...
  This means that for tabs that we do not want to sample as often as we usually do, we can set a minimum time to wait before we refresh this tab. This could be used for tabs like 'Cached Objects' which could be "heavy" for the system to sample on every sample interval.
- The summary panel now also contains a bunch of new counters.
- If ASE is between 15.0.3 esd#1 and 15.0.3 esd#3 and sp_configure 'capture missing statistics' is true. The CR 581760 makes ASE to capture statistics for MDA Tables, which might lead to a full transaction log in the master database.
  So check for a "near full" transaction log and do 'dump tran master with truncate_only' if we are near.
- If the stored procedure 'sp_missing_stats' in the tab 'Missing Statistics' is missing. It will automatically be installed if you have 'sa_role' otherwise the "watermark" will indicate this it's missing and needs to be installed.
  The procedure will not be re-installed every time, it checks for creation time, and will only be re-created when a new version of it is applicable.
- The watermark functionality can now handle multiple rows.
- Also a lot of small changes.

## 2009-11-06

- Automatically open the log viewer when a log message with the severity ERROR or higher is logged.
  LogViewer also remembers the window size and position.
- A new "tab" that shows what tables/columns the optimizer is missing statistics on.
  This needs ASE 15.0.3 ESD#1, and `sp_configure 'capture missing statistics', 1`
  A word of warning so for: The transaction log in the master database will/could fill up due to a bug in ASE where missing statistics on `mon*` tables is updated in `master..sysstatistics`
  A stored procedure `sp_missing_stats`, which (for now) will have to be manually installed before this tab will work...
- Un-selecting rows can now be done in JTables, also the background color could be set with the properties:

      			table.setSelectionBackground={true|false}
      			table.setSelectionBackground.r=intVal
      			table.setSelectionBackground.g=intVal
      			table.setSelectionBackground.b=intVal

- When a database connection is lost, better GUI error handling is applied.
  Meaning show LogViewer, set the watermark to "Not Connected".
- Changes on the Connect-on-startup, now using logic from the ConnectionDialog.
- Also a lot of small changes.

## 2009-05-21 - 2009-11-01

- A long period has passed since I did anything, this was due to I was in an accident where I broke/crushed both my hands/wrists, so I had problems coding...
  But now I'm back again :)

## 2009-05-20

- Changed the Color of the timeLine marker to dark gray.
- Added tick markers on the timeLine slider.
- Separating the TrendGraph's data into TrenGraphDataPoint class
  This makes it possible to save the graph data in it's own table, which makes it easier when reading "off-line" data in a later stage
- Added some AseMon* dictionary tables, which makes it easier when reading "off-line" data in a later stage
- In "off-line" noGui mode, when connecting, try to enable basic monitor settings if not already configured.

## 2009-05-15

- A first version where you can view older Counter Values
  All sampled counters are stored In-Memory, the counters are discarded from memory when "Trend Graph History in Minutes" expires. This means as long as the values are shown in the graph, they stays in memory.
  To enter Navigation mode for viewing the in-memory counters is done by double-click in one of the graphs, or press the "View Counters" in the toolbar. Navigation is done with the slider in the toolbar or by double-click on a interesting point in one of the graphs.
  A vertical line in the graphs represents where we are in the in-memory counters.

## 2009-04-30

- Used defined graphs can now do one trace line for every row.
  The 'graph.type' should then by 'byRow'
  'graph.data.cols' should contain the column name to get value from
  'graph.data.methods' can be 'absVal', 'diffVal' or 'rateVal'. 'graph.data.labels' can be a column name to get value from, or if that name is not found the values for the Primary Key will be used. So if you for example specify '-pk-', which is a unknown column name Then the PK values for that row will be used as the "label" for that line.
- Properties MenuItem on Counter Tab, this so we can see what SQL that is executing when we refresh the Counter Model.
- Wizard for crating User Defined Counters

## 2009-04-09

- Added panel 'Active/Process Statements'.
- Moved monProcessObject from asemon.properties into GetCounters.
- Added a summary page in the offline wizard.
- The offline is started from asemon script using parameters.
  asemon -nogui -config <conffile>
- The offline is completely dependent on this wizard generated config file. (Used to use asemon.properties). The wizard now copies the necessary info from asemon.properties to the generated file.

## 2009-04-08

- New web adress 'www.asemon.se', so references was changed for this
- Started to work on Storing Counter Data from the GUI
  A new Connection dialog has been made... but isn't finished yet. It works to setup a Counter Storage, but it needs more work.
  Offline connect doesn't work yet, I can't yet read stored data and present it in the GUI, thats the next step.

## 2009-03-31

- Checking for updates on the net (but I need to change the web address later)
  But I need to implement the web page for new downloads etc...
- Re-coded MainFrame and moved to GUI
- Trendgraph
  - setChartMaxHistoryTimeInMinutes() could get garbled.
  - Add dummypoint when not connected to avoid NPE from ToolTip. - also moved TrendGraph

## 2009-03-26

- Capture SQL on the right click menu
- Copy table information to clipboard (but: needs more work)
- Changed a bunch of the Icons and added icons to the GTabbedPane, right click menu, goto tab.
- SQL Window can now show graphical showplan views (same as dbisql).
  Some graphical changes as well, print/raiserror messages now comes in-line with the result sets (priviously it was just at the end)
  You can also select cells to copy+paste values from.
  Messages are now also copy+paste enabled.
- Using MigLayout in summary panel for graphs now, which makes it a bit nicer for resizing... the graphs grows in height now as well.
- For the filter "Do not show unchanged counter rows" I added the abbility to dissregard some columns. So even if it's a diff counter and it's NOT zero it will still filtered out that column.
  This is good for "WaitTime" column in the "Processes" tab. Because it's always contains values... I still want to see the diff/rate values. But I don't want to use them (as valid values) in the filter check.
- The filter "Do not show unchanged counter rows" has also been moved from the Options panel to the Filter panel, where it really resides.
  This also made me move the "Counter Type" panel one snap left...
- Selected row in the table is still selected after a "data refresh" and hopefully it's the same row even if it has changed location due to resort of the new/refreshed data...
- MainFrame - status panel (at bottom) now has Memory information
  This class will be needed to recode soon - the code is ugly...
- If data collection is paused, a watermark text will inform you about the Pause...
- The AboutBox panel now contains
  - History
  - Todo
  - System Properties

## 2009-03-16

- Moved the negativeDiffCounters to Zero so we can choose this for each panel....
- Added icons for the TableCntrPanel and most of the CM's
- Some small changes on the xmenu stuff.

## 2009-03-13

- ALOT OF THINGS WHERE DONE
- Moved a lot of files around, the goal is that all GUI components should be in 'gui' package
- Configuration.java: moved to utils package, and added encrypt/decrypt of passwords
- AseMonitoringConfig -> gui.AseMonitoringConfigDialog: remade gui layout
- CountersModel Made it a TableModel... there is a lot more needed to be done on this one and that will be done in next check-in
- A new dictionary for displaying ToolTip on WaitEventId
- Moved Version information into its own class 'Version.java'
- The ConnectionDialog has been totally rewritten
- Auto login ability on startup
- A logAppender for log4j that has a Gui Window so we can look at the errorlog graphically and also change the log level "on the fly", but the log level is not saved into the properties file. We only want to change it during this session.
- Total new Dialog for changing some small properties (only Refresh rate for now)
- A new 'Query window' has been added to the MainFrame menu. This will open a GUI 'isql'
- TabularCntrPanel has been rewritten:
  - The TabbedPane has been rewritten to do "dock/undock" tabs into windows and right click popups on the Tabbs that handles more stuff.
  - now using MigLayout as it's Gui layout manager
  - Using JXTable instead of JTable
  - Sorting is done by JXTable
  - Filtering is done by JXTable
  - Highlighting/Color setting is done by JXTable (in JTable this is CellRenderer)
  - right-click on the table now uses 'xmenu', which is specified in the config file so now it's really easy to add your own right click menu items. Default menu items is 'stored proc text, sp callstack, optdiag, sp_help, sp_spaceused...'
- A bunch of new icons has been added
- AboutBox total rewrite
- And a lot more small stuff
- NOTE: A lot more is needed to be changed and cleanup, so this is just a partial check-in.
- Reine Changed TrendGraph to use JChart2D instead of JFreeChart, this due to performance reasons when we had *long* "Graph History Time". This was merged in from the "trunk".

## 2009-02-12

- Multiple ResultSets is now handled
- Watermark on the summary graphs is now on the scroll panel, this makes the watermark more center of the view/what we see...

## 2009-02-03

- User Defined Graph can be added this probably needs more work, but for now it's "ok"...
- SummaryPanel was "redesigned" and moved to GUI package
- Default ASEMon Icon was changed (added more blue on the table)

## 2009-01-23

- Sometimes that graphs did not get updated in the summary panel. This was a timing problem, when data is captured, it's done with it's own thread. If the "get data" thread was not complete before we wanted to update the graphs, the graphs was not updated. So now I wait for the "get data thread" to complete before continue.
- The Toolbar was added.
- The first glans at "offline setup wizard" was created (need more work here)
- Changed the j4log from 1.2.8 -> 1.2.15
- Some small stuff as well
- Default ASEMon Icon was changed

## 2008-10-31

- Fixed bug in summary panel counte. If ASE listens to several networks only show the first "min()" listener. otherwise the subquery will fail...
- Added Wrap/Scroll capability in the TabPanel

## 2008-10-27

- Fixed bug in engine average calculation... in version X i changed getRateValueAvg to discard 0.0 as "rows" this was to support the Average Service Time in DeviceIO graph better. But now I'm using getRateValueAvgGtZero instead.
- Added the "WATER MARK" text to TabularControlPanel and SummaryPanel to easier know what is happening behind the scenes... are we connected...
- Added some descriptions for Tooltip on the TABS.
- added methods: isMonConnected(), getMonConnection() this will hopefully be used to distinguish between OFF-Line mode and ON-Line mode.

## 2008-10-24

- Added this "version history" comment
- Doing "late initialization" of CountersObject, which means that we can create the GUI graphics and decide later what SQL statement to use dependent on what version the ASE Server is of.
- Took away a lot of static variables in GetCounters and MainFrame

## 2008-10-16

- Major thing is NO-GUI mode is configurable and can persist the counters in a JDBC session. (ASE and H2 has been tested) H2 would be the preferred option. This so we can store the counters in another server/database store than the one we pulling out data from. Using the H2 DB it would also be easier to sample ASE counters on Unix systems and later on view them on a Windows machine.
- some changes to "capture SQL" tool.
- saving more options in the "save props" file!
- And a lot more small things.

## 200x-xx-xx

- Started from asemon 0.96 by Jean-Paul Martin
  Redone a whole lot of things
- Automatic resize of columns headers in tables
- Cell renders are not dependent on Object type, but it's now using method calls to decide what to do when rendering.
- Do not remember all things I did back then