You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@iotdb.apache.org by "SeanGaluzzi (via GitHub)" <gi...@apache.org> on 2024/02/22 10:12:43 UTC

[I] [Bug] Alerting with triggers [iotdb]

SeanGaluzzi opened a new issue, #12070:
URL: https://github.com/apache/iotdb/issues/12070

   ### Search before asking
   
   - [X] I searched in the [issues](https://github.com/apache/iotdb/issues) and found nothing similar.
   
   
   ### Version
   
   - IoTDB Verions: 1.2.2 (Build: 5d0bfb0)
   - Java Version:  java 21.0.2 2024-01-16 LTS
   
   
   ### Describe the bug and provide the minimal reproduce step
   
   # I got some error while trying to add a trigger with quite litterally the documentation provided example:
   ## ClusterAlertingExample.java File
   ```java
   /*
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements.  See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership.  The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License.  You may obtain a copy of the License at
    *
    *     http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied.  See the License for the
    * specific language governing permissions and limitations
    * under the License.
    */
   
    package org.apache.iotdb.trigger;
   
    import org.apache.iotdb.db.engine.trigger.sink.alertmanager.AlertManagerConfiguration;
    import org.apache.iotdb.db.engine.trigger.sink.alertmanager.AlertManagerEvent;
    import org.apache.iotdb.db.engine.trigger.sink.alertmanager.AlertManagerHandler;
    import org.apache.iotdb.trigger.api.Trigger;
    import org.apache.iotdb.trigger.api.TriggerAttributes;
    import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
    import org.apache.iotdb.tsfile.write.record.Tablet;
    import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    
    public class ClusterAlertingExample implements Trigger {
    
      private final AlertManagerHandler alertManagerHandler = new AlertManagerHandler();
    
      private final AlertManagerConfiguration alertManagerConfiguration =
          new AlertManagerConfiguration("http://127.0.0.1:9093/api/v2/alerts");
    
      private String alertname;
    
      private final HashMap<String, String> labels = new HashMap<>();
    
      private final HashMap<String, String> annotations = new HashMap<>();
    
      @Override
      public void onCreate(TriggerAttributes attributes) throws Exception {
        alertname = "alert_test";
    
        labels.put("series", "root.Firewall");
        labels.put("value", "");
        labels.put("severity", "");
    
        annotations.put("summary", "high temperature");
        annotations.put("description", "{{.alertname}}: {{.series}} is {{.value}}");
    
        alertManagerHandler.open(alertManagerConfiguration);
      }
    
      @Override
      public void onDrop() throws IOException {
        alertManagerHandler.close();
      }
    
      @Override
      public boolean fire(Tablet tablet) throws Exception {
        List<MeasurementSchema> measurementSchemaList = tablet.getSchemas();
        for (int i = 0, n = measurementSchemaList.size(); i < n; i++) {
          if (measurementSchemaList.get(i).getType().equals(TSDataType.DOUBLE)) {
            // for example, we only deal with the columns of Double type
            double[] values = (double[]) tablet.values[i];
            for (double value : values) {
              if (value > 100.0) {
                labels.put("value", String.valueOf(value));
                labels.put("severity", "critical");
                AlertManagerEvent alertManagerEvent =
                    new AlertManagerEvent(alertname, labels, annotations);
                alertManagerHandler.onEvent(alertManagerEvent);
              } else if (value > 50.0) {
                labels.put("value", String.valueOf(value));
                labels.put("severity", "warning");
                AlertManagerEvent alertManagerEvent =
                    new AlertManagerEvent(alertname, labels, annotations);
                alertManagerHandler.onEvent(alertManagerEvent);
              }
            }
          }
        }
        return true;
      }
    }
   ```
   ## pom.xml File
   ```xml
   <?xml version="1.0" encoding="UTF-8"?>
   
   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
   
     <groupId>apache.iotdb</groupId>
     <artifactId>cluster_alerting</artifactId>
     <version>1.0-SNAPSHOT</version>
   
     <name>cluster_alerting</name>
     <!-- FIXME change it to the project's website -->
     <url>http://www.example.com</url>
   
     <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <maven.compiler.source>1.7</maven.compiler.source>
       <maven.compiler.target>1.7</maven.compiler.target>
     </properties>
   
     <build>
       <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
         <plugins>
           <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
           <plugin>
             <artifactId>maven-clean-plugin</artifactId>
             <version>3.1.0</version>
           </plugin>
           <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
           <plugin>
             <artifactId>maven-resources-plugin</artifactId>
             <version>3.0.2</version>
           </plugin>
           <plugin>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>3.8.0</version>
           </plugin>
           <plugin>
             <artifactId>maven-surefire-plugin</artifactId>
             <version>2.22.1</version>
           </plugin>
           <plugin>
             <artifactId>maven-jar-plugin</artifactId>
             <version>3.0.2</version>
           </plugin>
           <plugin>
             <artifactId>maven-install-plugin</artifactId>
             <version>2.5.2</version>
           </plugin>
           <plugin>
             <artifactId>maven-deploy-plugin</artifactId>
             <version>2.8.2</version>
           </plugin>
           <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
           <plugin>
             <artifactId>maven-site-plugin</artifactId>
             <version>3.7.1</version>
           </plugin>
           <plugin>
             <artifactId>maven-project-info-reports-plugin</artifactId>
             <version>3.0.0</version>
           </plugin>
         </plugins>
       </pluginManagement>
     </build>
   
   
     <dependencies>
   
       <dependency>
         <groupId>org.apache.iotdb</groupId>
         <artifactId>iotdb-server</artifactId>
         <version>1.2.0</version>
       </dependency>
       
     </dependencies>
   </project>
   
   ```
   
   # The schema file is like this 
   i'm missing something?
   ```plaintext
       cluster_alerting
       ├── src/main/java/org/apache/iotdb/trigger/
       │   └── ClusterAlertingExample.java
       └── pom.xml
   ```
   
   ################################################################################################
   - I have builded the jar file using `mvn compile` -> `mvn package` command
   - Then using the `jar tvf` command i got this output:
   
   ```plaintext
       93 Thu Feb 22 09:48:48 UTC 2024 META-INF/MANIFEST.MF
        0 Thu Feb 22 09:48:48 UTC 2024 META-INF/
        0 Thu Feb 22 09:47:38 UTC 2024 org/
        0 Thu Feb 22 09:47:38 UTC 2024 org/apache/
        0 Thu Feb 22 09:47:38 UTC 2024 org/apache/iotdb/
        0 Thu Feb 22 09:47:40 UTC 2024 org/apache/iotdb/trigger/
        0 Thu Feb 22 09:48:48 UTC 2024 META-INF/maven/
        0 Thu Feb 22 09:48:48 UTC 2024 META-INF/maven/apache.iotdb/
        0 Thu Feb 22 09:48:48 UTC 2024 META-INF/maven/apache.iotdb/cluster_alerting/
     3835 Thu Feb 22 09:48:40 UTC 2024 org/apache/iotdb/trigger/ClusterAlertingExample.class
     2905 Thu Feb 22 09:47:34 UTC 2024 META-INF/maven/apache.iotdb/cluster_alerting/pom.xml
      101 Thu Feb 22 09:48:48 UTC 2024 META-INF/maven/apache.iotdb/cluster_alerting/pom.properties
   ```
   
   ## As you can see i have a java class called `org/apache/iotdb/trigger/ClusterAlertingExample.class` 
   ### but on IoTDB while i try to create the trigger i got this error:
   
   ```bash
   IoTDB> CREATE STATELESS TRIGGER test
   >  BEFORE INSERT
   >  ON root.Firewall.**
   >  AS 'org.apache.iotdb.trigger.ClusterAlertingExample'
   >  USING URI 'file:///home/sean/apache-iotdb/ext/trigger/install/cluster_alerting-1.0-SNAPSHOT.jar'
   Msg: 1303: Failed to load class 'org.apache.iotdb.trigger.ClusterAlertingExample', because it's not found in jar file: file:///home/sean/apache-iotdb/ext/trigger/install/cluster_alerting-1.0-SNAPSHOT.jar
   
   ```
   
   ### What did you expect to see?
   
   ### I'll expect to see a succesfully statement while execute the CREATE STATELESS TRIGGER function
   ```bash
   IoTDB> CREATE STATELESS TRIGGER test
   >  BEFORE INSERT
   >  ON root.Firewall.**
   >  AS 'org.apache.iotdb.trigger.ClusterAlertingExample'
   >  USING URI 'file:///home/sean/apache-iotdb/ext/trigger/install/cluster_alerting-1.0-SNAPSHOT.jar'
   Msg: The statement is executed successfully.
   ```
   
   ### What did you see instead?
   
   ### I got an error statement while execute the CREATE STATELESS TRIGGER function saying that the class is missing in the jar file
   ```bash
   IoTDB> CREATE STATELESS TRIGGER test
   >  BEFORE INSERT
   >  ON root.Firewall.**
   >  AS 'org.apache.iotdb.trigger.ClusterAlertingExample'
   >  USING URI 'file:///home/sean/apache-iotdb/ext/trigger/install/cluster_alerting-1.0-SNAPSHOT.jar'
   Msg: 1303: Failed to load class 'org.apache.iotdb.trigger.ClusterAlertingExample', because it's not found in jar file: file:///home/sean/apache-iotdb/ext/trigger/install/cluster_alerting-1.0-SNAPSHOT.jar
   ```
   
   ### Anything else?
   
   _No response_
   
   ### Are you willing to submit a PR?
   
   - [ ] I'm willing to submit a PR!


-- 
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: reviews-unsubscribe@iotdb.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org