paul-rogers commented on issue #13123:
URL: https://github.com/apache/druid/issues/13123#issuecomment-1450525821

   After some discussion, here is an alternative approach to satisfy some 
additional requirements. This is primarily for discussion to help brainstorm a 
solution.
   
   * Error messages must be localizable: not so much for language, as to use 
terminology consistent with a deployment or to redact information not 
appropriate in a given context.
   * Every error must have a unique error code (also required to enable the 
message catalog).
   
   Given this, we propose that all errors have a unique text error code. We can 
standardize around a pattern such as "SQL" + "Validation" + "SpecificError" or 
"MSQ" + "IO" + "SpecificError". Error codes form a hierarchy.
   
   Each error provides a set of named parameters that are interpolated into the 
error text. For example:
   
   ```text
   Code: ['SQL'. 'Validation', 'ColumNotFound']
   Column: foo
   Line: 4
   Position: 3
   ID: 0000-1111-2222...
   ```
   
   Each error instance is given a unique UUID to allow system operators to find 
the specific error instance in logs that users saw in a UI.
   
   Then, the message catalog can have a variety of messages depending on the 
level of detail appropriate to given deployment:
   
   For example, for out-of-the-box Druid:
   
   ```text
   Line [{Line}], Column [{Position]]: Column [{Column}] was not found in any 
table in the query.
   ```
   
   For a deployment when the front end allows the user to select columns, but 
not edit the SQL:
   
   ```text
   No such column [{Column}]
   ```
   
   For a deployment where the SQL queries are hard-coded, power a dashboard, 
and only a development team can modify the SQL. The error indicates a bug in 
the application:
   
   ```text
   Invalid SQL: contact Support. Case {ID}
   ```
   
   To make this work, each application would be a subclass of a 
`DruidException` which has a set of attributes, but not a message:
   
   * Error code
   * Event ID
   * Parameters, as fields on the class
   
   The text of each message is given in message catalog, represented as a 
properties file following the Java I18N pattern. For example, for the stock 
`druid.properties`:
   
   ```text
   SQLValidationColumNotFound=Line [{Line}], Column [{Position]]: Column 
[{Column}] was not found in any table in the query.
   ```
   
   Each deployment can provide a custom file. The file overrides the standard 
Druid messages. Messages not defined in the override catalog use the Druid 
version. For example for a deployment for ABC Co., define `abc.properties`:
   
   ```text
   SQLValidationColumNotFound=No such column [{Column}]
   ```
   
   Each exception can be logged. Logging can be set up based on the code 
hierarchy. For example, on out-of-the-box Druid, SQL errors might not be logged 
because they are directed at users. Other sites may choose to log everything. 
Logging of errors uses a site-defined format. Options may include:
   
   * Include the ID or not.
   * Include the error code or not.
   * Use message or individual fields instead.
   
   For backward compatibility, out-of-the-box may log the error messages 
formatted from the catalog. Other sides may want messages of the form:
   
   ```text
   {ID} {Code} {Params}
   ```
   
   Example:
   
   ```text
   0000-1111-2222...: SQL-Validation-ColumNotFound - Line: 4, Position: 3, 
Column: 'foo'
   ```
   
   To make the above work, every exception is a subclass of `DruidException`. 
Each class can represent one or more error codes. The exception includes 
parameters as fields. The class is Jackson-serializable so it can be passed 
between nodes. The class provides metadata about the error, the field 
serialization order for logs, etc.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to