diff --git a/.gitignore b/.gitignore index 59a29f4..74032dc 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,5 @@ hs_err* ### MISC ### src/main/resources/build-info.properties +verifier-all.jar +verification* diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/YQL.java b/src/main/java/com/pehrs/vespa/yql/plugin/YQL.java index 62787db..d5f1d96 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/YQL.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/YQL.java @@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.wm.RegisterToolWindowTask; +import com.intellij.openapi.wm.RegisterToolWindowTaskBuilder; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowFactory; @@ -29,6 +30,7 @@ import java.util.Locale; import java.util.Map; import java.util.Properties; +import kotlin.Unit; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,8 +42,7 @@ public class YQL implements StartupActivity { private static final Logger log = LoggerFactory.getLogger(YQL.class); - public final static String TOOL_WINDOW_ID = "YqlVespaResultsWindow"; - public final static String TOOL_WINDOW_TITLE = "Vespa Results"; + public final static String TOOL_WINDOW_ID = "Vespa Results"; public YQL() { } @@ -160,26 +161,9 @@ public static String getDefaultBrowserScript() { } @NotNull - public static ToolWindow getVespaToolWindow(Project project, ToolWindowFactory intialFactory) { + public static ToolWindow getVespaToolWindow(Project project) { ToolWindowManager mgr = ToolWindowManager.getInstance(project); - ToolWindow toolWindow = mgr.getToolWindow(TOOL_WINDOW_ID); - if (toolWindow == null) { - // log.warn("No tool window, let's try to create it :-)"); - toolWindow = mgr.registerToolWindow(new RegisterToolWindowTask( - TOOL_WINDOW_ID, - ToolWindowAnchor.BOTTOM, - null, - false, - true, - false, - true, - intialFactory, - YqlIcons.FILE, - () -> TOOL_WINDOW_TITLE - ) - ); - } - return toolWindow; + return mgr.getToolWindow(TOOL_WINDOW_ID); } @Override @@ -187,15 +171,13 @@ public void runActivity(@NotNull Project project) { // Run once at startup :-) log.debug("vespa-yql-plugin STARTUP!"); -// ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project); -// ToolWindow toolWindow = toolWindowManager.getToolWindow( -// VespaLogContent.TOOL_WINDOW_ID); -// if(toolWindow != null) { -// toolWindow.setAutoHide(true); -// toolWindow.hide(); -// toolWindow.remove(); -// } - + ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project); + ToolWindow toolWindow = toolWindowManager.getToolWindow(TOOL_WINDOW_ID); + if(toolWindow != null) { + toolWindow.setAutoHide(true); + toolWindow.hide(); + // toolWindow.remove(); + } ApplicationManager.getApplication().executeOnPooledThread(() -> { for (; ; ) { // ever diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockFactory.java b/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockFactory.java index f69d1ec..2c90e3a 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockFactory.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockFactory.java @@ -15,30 +15,17 @@ public class YqlDockFactory implements ToolWindowFactory, DumbAware { // }, YqlA Project project; private YqlDockPanel settingsComponent; - // private YqlAppSettingsComponent settingsComponent; - @Override - public boolean isApplicable(@NotNull Project project) { - return project != null; - } @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { this.project = project; - // YqlAppSettingsStateListener.addListener(this); - - // this.settingsComponent = new YqlAppSettingsComponent(project, false); this.settingsComponent = new YqlDockPanel(project); ContentManager contentManager = toolWindow.getContentManager(); Content content = contentManager.getFactory().createContent(settingsComponent, null, false); contentManager.addContent(content); } - -// @Override -// public void stateChanged(YqlAppSettingsState instance) { -// this.settingsComponent.refresh(); -// } } diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockPanel.java b/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockPanel.java index 80d865e..9b306c0 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockPanel.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/dock/YqlDockPanel.java @@ -49,14 +49,12 @@ public class YqlDockPanel extends JBPanel implements YqlAppSettingsStateListener private static final Logger log = LoggerFactory.getLogger(YqlDockPanel.class); private final Project project; -// private DefaultMutableTreeNode configRoot; -// private DefaultTreeModel treeModel; -// private DnDAwareTree configTree; private JBTable clusterTable; private VespaClusterStatusTableModel clusterTableModel; - private AnActionButton configActionBtn; - private AnActionButton openLogsConfigBtn; + private AnAction configAction; + private AnAction openLogsConfig; + private boolean openLogsConfigEnabled = true; public YqlDockPanel(Project project) { @@ -72,73 +70,6 @@ private void createComponents() { JBLabel label = new JBLabel(); -// this.configRoot = new DefaultMutableTreeNode(); -// this.configRoot.setUserObject("Vespa Clusters"); -// this.treeModel = new DefaultTreeModel(configRoot); -// this.configTree = new DnDAwareTree(treeModel); -// -// this.configTree.addMouseListener(new MouseAdapter() { -// @Override -// public void mouseClicked(MouseEvent e) { -// if (e.getClickCount() >= 2) { -// TreePath path = configTree.getLeadSelectionPath(); -// if (path == null) { -// super.mouseClicked(e); -// return; -// } -// DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); -// Object userObj = node.getUserObject(); -// if (userObj instanceof VespaClusterConfig config) { -// // This is a double click :-) -// YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); -// settings.currentConnection = config.name; -// YqlAppSettingsStateListener.notifyListeners(settings); -// } -// super.mouseClicked(e); -// } -//// if (e.getClickCount() == 1) { -//// // Selected -//// TreePath path = configTree.getLeadSelectionPath(); -//// DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); -//// Object userObj = node.getUserObject(); -//// if (userObj instanceof VespaClusterConfig config) { -//// nameField.setText(config.name); -//// queryEndpointField.setText(config.queryEndpoint); -//// configEndpointField.setText(config.configEndpoint); -//// } -//// } -// } -// }); -// -// // -// // Renderer -// // -// this.configTree.setCellRenderer((tree, value, selected, expanded, leaf, row, hasFocus) -> { -// DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; -// if (node == configRoot) { -// label.setText("Vespa Clusters"); -// label.setIcon(Nodes.ConfigFolder); -// } else { -// Object uo = node.getUserObject(); -// if (uo instanceof VespaClusterConfig config) { -// label.setText(String.format("%s - %s", config.name, config.queryEndpoint)); -// YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); -// if (config.name.equals(settings.currentConnection)) { -// // label.setIcon(Actions.Checked); -// label.setIcon(Diff.GutterCheckBoxSelected); -// } else { -// // label.setIcon(YqlIcons.FILE); -// // label.setIcon(null); -// label.setIcon(Diff.GutterCheckBox); -// } -// } else { -// label.setText("" + uo); -// label.setIcon(null); -// } -// } -// return label; -// }); - this.clusterTableModel = new VespaClusterStatusTableModel(); this.clusterTable = new JBTable(clusterTableModel); this.clusterTable.addMouseListener(new MouseAdapter() { @@ -248,39 +179,8 @@ public void vespaClusterStatusUpdated() { .disableRemoveAction() .disableDownAction() .disableUpAction(); -// decorator.addExtraAction( -// AnActionButton.fromAction(new DumbAwareAction("Add Connection", "", General.Add) { -// public void actionPerformed(@NotNull AnActionEvent e) { -// if (e == null) { -// return; -// } -// if (project != null) { -// YqlAddConnectionDialog dialog = new YqlAddConnectionDialog(project); -// dialog.show(); -// } -// } -// })); -// decorator.addExtraAction( -// AnActionButton.fromAction(new DumbAwareAction("Delete Connection", "", General.Remove) { -// public void actionPerformed(@NotNull AnActionEvent e) { -// if (e == null) { -// return; -// } -// -// DefaultMutableTreeNode selected = -// (DefaultMutableTreeNode) configTree.getLeadSelectionPath().getLastPathComponent(); -// VespaClusterConfig config = (VespaClusterConfig) selected.getUserObject(); -// -// YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); -// settings.removeClusterConfig(config); -// YqlAppSettingsStateListener.notifyListeners(settings); -// -// System.out.println( -// "Delete connection!!!" + configTree.getLeadSelectionPath().getLastPathComponent()); -// } -// })); - this.configActionBtn = new AnActionButton("Config", "Open configuration", General.Settings ) { + this.configAction = new AnAction("Config", "Open configuration", General.Settings ) { @Override public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { @@ -290,7 +190,7 @@ public void actionPerformed(@NotNull AnActionEvent e) { // "com.pehrs.vespa.yql.plugin.settings.YqlAppSettingsConfigurable"); } }; - decorator.addExtraAction(configActionBtn); + decorator.addExtraAction(configAction); AnAction reloadAction = new AnAction("Refresh Vespa Cluster Status", "...", Actions.Refresh) { public void actionPerformed(@NotNull AnActionEvent e) { @@ -304,7 +204,13 @@ public void actionPerformed(@NotNull AnActionEvent e) { } }; decorator.addExtraAction(reloadAction); - this.openLogsConfigBtn = new AnActionButton("Open Vespa Logs", "...", General.Warning) { + this.openLogsConfig = new AnAction("Open Vespa Logs", "...", General.Warning) { + + @Override + public void update(@NotNull AnActionEvent event) { + event.getPresentation().setEnabledAndVisible(openLogsConfigEnabled); + } + public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { return; @@ -315,8 +221,8 @@ public void actionPerformed(@NotNull AnActionEvent e) { } }; YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); - openLogsConfigBtn.setEnabled(settings.doMonitorLogs); - decorator.addExtraAction(openLogsConfigBtn); + this.openLogsConfigEnabled = settings.doMonitorLogs; + decorator.addExtraAction(openLogsConfig); JPanel treePanel = decorator.createPanel(); treePanel.setBorder(Borders.empty()); @@ -347,16 +253,6 @@ public void actionPerformed(@NotNull AnActionEvent e) { super.add(myMainPanel, BorderLayout.NORTH); } -// public void addClusterConfig(VespaClusterConfig config) { -// this.configRoot.add(new DefaultMutableTreeNode(config, false)); -// } - -// public void setVespaClusterConfigs(List configs) { -// configRoot.removeAllChildren(); -// configs.stream().forEach(config -> addClusterConfig(config)); -// treeModel.nodeStructureChanged(configRoot); -// } - public void refresh() { // YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); // setVespaClusterConfigs(settings.clusterConfigs); @@ -366,7 +262,7 @@ public void refresh() { @Override public void stateChanged(YqlAppSettingsState instance) { YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); - openLogsConfigBtn.setEnabled(settings.doMonitorLogs); + this.openLogsConfigEnabled = settings.doMonitorLogs; this.refresh(); } } diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/logserver/VespaLogsViewFactory.java b/src/main/java/com/pehrs/vespa/yql/plugin/logserver/VespaLogsViewFactory.java index 641390e..90d651a 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/logserver/VespaLogsViewFactory.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/logserver/VespaLogsViewFactory.java @@ -25,12 +25,6 @@ public void init(@NotNull ToolWindow toolWindow) { } - public boolean isApplicable(@NotNull Project project) { - // FIXME: Check if project is a Java or Vespa project!!! - return project != null; - } - - @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { // Create an instance of your custom content component @@ -48,7 +42,7 @@ public static void openLogs(Project project) { // FIXME: Check to see if we Should open the log view here! - ToolWindow toolWindow = YQL.getVespaToolWindow(project, factory); + ToolWindow toolWindow = YQL.getVespaToolWindow(project); if (toolWindow != null) { final ToolWindow win = toolWindow; @NotNull ContentManager contentManager = win.getContentManager(); diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultTraceTreeModel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultTraceTreeModel.java deleted file mode 100644 index 9644bb5..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultTraceTreeModel.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.pehrs.vespa.yql.plugin.results; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.intellij.util.ui.tree.AbstractTreeModel; -import com.pehrs.vespa.yql.plugin.YqlResult; -import com.pehrs.vespa.yql.plugin.YqlResult.YqlResultListener; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; -import javax.swing.tree.TreePath; - -@Deprecated -public class YqlResultTraceTreeModel extends AbstractTreeModel implements YqlResultListener { - - public record JsonProperty(String name, JsonNode value) { - - } - - JsonProperty traceRoot; - - static ObjectMapper mapper = new ObjectMapper(); - - public YqlResultTraceTreeModel() { - // Start with empty node - this.traceRoot = new JsonProperty("empty", mapper.createObjectNode()); - } - - @Override - public Object getRoot() { - return traceRoot; - } - - private List getFieldNames(JsonNode node) { - Iterable iterable = () -> node.fieldNames(); - return StreamSupport - .stream(iterable.spliterator(), false) - .collect(Collectors.toList()); - } - - @Override - public Object getChild(Object parent, int index) { - JsonProperty property = (JsonProperty) parent; - JsonNode node = property.value(); - if (node instanceof ObjectNode) { - List fields = getFieldNames(node); - String fieldName = fields.get(index); - JsonNode value = node.get(fieldName); - return new JsonProperty(fieldName, value); - } else if (node instanceof ArrayNode) { - return new JsonProperty("" + index, node.get(index)); - } else { - // Others do not have children!!! - return null; - } - } - - @Override - public int getChildCount(Object parent) { - JsonProperty property = (JsonProperty) parent; - JsonNode node = property.value(); - - if (node instanceof ObjectNode) { - List fields = getFieldNames(node); - return fields.size(); - } else if (node instanceof ArrayNode arrayNode) { - return arrayNode.size(); - } else { - return 0; - } - } - - @Override - public boolean isLeaf(Object node) { - return getChildCount(node) == 0; - } - - @Override - public void valueForPathChanged(TreePath path, Object newValue) { - System.out.println("value changed for " + path + " value: " + newValue); - } - - @Override - public int getIndexOfChild(Object parent, Object child) { - JsonProperty property = (JsonProperty) parent; - JsonNode node = property.value(); - JsonProperty childProperty = (JsonProperty) child; - JsonNode childNode = childProperty.value(); - - if (node instanceof ObjectNode) { - List fields = getFieldNames(node); - for (int i = 0; i < fields.size(); i++) { - String fieldName = fields.get(i); - JsonNode value = node.get(fieldName); - if (value.equals(childNode)) { - return i; - } - } - } else if (node instanceof ArrayNode arrayNode) { - for (int i = 0; i < arrayNode.size(); i++) { - JsonNode c = node.get(i); - if (c.equals(childNode)) { - return i; - } - } - } - - return -1; - } - - @Override - public void resultUpdated(YqlResult result) { - - result.getTrace() - .ifPresentOrElse(traceNode -> { - this.traceRoot = new JsonProperty("trace", traceNode); - }, () -> { - this.traceRoot = new JsonProperty("empty", mapper.createObjectNode()); - }); - // Notify that the root has changed - // TreePath rootPath = new TreePath(treeRoot); - super.treeStructureChanged(null, null, null); - } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsFactory.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsFactory.java index 5c2b821..76f70f3 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsFactory.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsFactory.java @@ -21,11 +21,6 @@ public class YqlResultsFactory implements ToolWindowFactory { // , DumbAware, Yq private YqlResultsTabView tabs; - @Override - public boolean isApplicable(@NotNull Project project) { - return project != null; - } - @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { @@ -39,7 +34,7 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo } public static void showResults(Project project) { - ToolWindow toolWindow = YQL.getVespaToolWindow(project, factory); + ToolWindow toolWindow = YQL.getVespaToolWindow(project); if (toolWindow != null) { final ToolWindow win = toolWindow; @NotNull ContentManager contentManager = win.getContentManager(); diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsJsonPanel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsJsonPanel.java index ea2dfb8..6e615e1 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsJsonPanel.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsJsonPanel.java @@ -3,7 +3,6 @@ import com.intellij.icons.AllIcons.Actions; import com.intellij.json.JsonFileType; import com.intellij.json.JsonLanguage; -import com.intellij.notification.NotificationType; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionPlaces; @@ -19,10 +18,8 @@ import com.intellij.openapi.fileChooser.FileSaverDescriptor; import com.intellij.openapi.fileChooser.FileSaverDialog; import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.project.ProjectManagerListener; import com.intellij.openapi.project.VetoableProjectManagerListener; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFileWrapper; @@ -103,17 +100,16 @@ private void createComponents() { editorSettings.setRightMarginShown(true); YqlResult.addResultListener(this); -// YqlResult.addResultListener(new YqlResultListener() { -// @Override -// public void resultUpdated(YqlResult result) { -// ApplicationManager.getApplication().runWriteAction(() -> { -// doc.setText(result.toString()); -// }); -// } -// }); - - AnAction exportAction = new DumbAwareAction("Export JSON", "Export JSON result", + + AnAction exportAction = new AnAction("Export JSON", "Export JSON result", Actions.Download) { + + @Override + public void update(@NotNull AnActionEvent event) { + boolean enabled = editor.getDocument().getText().trim().length() > 0; + event.getPresentation().setEnabledAndVisible(enabled); + } + @Override public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { @@ -137,8 +133,16 @@ public void actionPerformed(@NotNull AnActionEvent e) { } } }; - AnAction openInEditorAction = new DumbAwareAction("Open in Editor", + AnAction openInEditorAction = new AnAction("Open in Editor", "Create new file and open JSON response in editor", Actions.AddFile) { + + + @Override + public void update(@NotNull AnActionEvent event) { + boolean enabled = editor.getDocument().getText().trim().length() > 0; + event.getPresentation().setEnabledAndVisible(enabled); + } + @Override public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTablePanel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTablePanel.java index 5ba2211..5c9ec47 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTablePanel.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTablePanel.java @@ -1,9 +1,9 @@ package com.pehrs.vespa.yql.plugin.results; import com.intellij.icons.AllIcons.Actions; -import com.intellij.notification.NotificationGroupManager; import com.intellij.notification.NotificationType; import com.intellij.openapi.actionSystem.ActionToolbarPosition; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.fileChooser.FileSaverDescriptor; @@ -34,8 +34,11 @@ public class YqlResultsTablePanel extends JBPanel { private final Project project; @Getter private YqlResultsTableModel tableModel; - private AnActionButton exportAsCsvBtn; - private AnActionButton exportAsTsvBtn; + private AnAction exportAsCsvAction; + private boolean exportAsCsvActionEnabled = false; + private AnAction exportAsTsvAction; + private boolean exportAsTsvActionEnabled = false; + public YqlResultsTablePanel(Project project) { super(new BorderLayout()); @@ -45,8 +48,8 @@ public YqlResultsTablePanel(Project project) { } public void enableExport(boolean enable) { - this.exportAsCsvBtn.setEnabled(enable); - this.exportAsTsvBtn.setEnabled(enable); + this.exportAsCsvActionEnabled = enable; + this.exportAsTsvActionEnabled = enable; } protected void notifyModel() { @@ -77,7 +80,13 @@ private void createComponents() { .initPosition() .setToolbarPosition(ActionToolbarPosition.TOP); - this.exportAsCsvBtn = new AnActionButton("Export as CSV", Actions.Download) { + this.exportAsCsvAction = new AnAction("Export as CSV", null, Actions.Download) { + + @Override + public void update(@NotNull AnActionEvent event) { + event.getPresentation().setEnabledAndVisible(exportAsCsvActionEnabled); + } + @Override public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { @@ -101,16 +110,15 @@ public void actionPerformed(@NotNull AnActionEvent e) { } } }; - decorator.addExtraAction(exportAsCsvBtn); + decorator.addExtraAction(exportAsCsvAction); -// decorator.addExtraAction( -// AnActionButton.fromAction( -// new DumbAwareAction("Export as CSV", "Export table as CSV", Actions.Download) { -// public void actionPerformed(@NotNull AnActionEvent e) { -// } -// })); + this.exportAsTsvAction = new AnAction("Export as TSV", null, Actions.Download) { + + @Override + public void update(@NotNull AnActionEvent event) { + event.getPresentation().setEnabledAndVisible(exportAsTsvActionEnabled); + } - this.exportAsTsvBtn = new AnActionButton("Export as CSV", Actions.Download) { @Override public void actionPerformed(@NotNull AnActionEvent e) { FileSaverDescriptor descriptor = new FileSaverDescriptor( @@ -131,15 +139,7 @@ public void actionPerformed(@NotNull AnActionEvent e) { } } }; - -// decorator.addExtraAction( -// AnActionButton.fromAction( -// new DumbAwareAction("Export as TSV", "Export table as TSV", Actions.Download) { -// public void actionPerformed(@NotNull AnActionEvent e) { -// -// } -// })); - decorator.addExtraAction(this.exportAsTsvBtn); + decorator.addExtraAction(this.exportAsTsvAction); JPanel panel = decorator.createPanel(); panel.setBorder(Borders.empty()); diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTablePanel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTablePanel.java deleted file mode 100644 index 6ea4215..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTablePanel.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.pehrs.vespa.yql.plugin.results; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.intellij.notification.NotificationGroupManager; -import com.intellij.notification.NotificationType; -import com.intellij.openapi.actionSystem.ActionToolbarPosition; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.ui.ToolbarDecorator; -import com.intellij.ui.components.JBPanel; -import com.intellij.ui.table.JBTable; -import com.intellij.util.ui.JBUI.Borders; -import com.pehrs.vespa.yql.plugin.YqlIcons; -import com.pehrs.vespa.yql.plugin.YqlResult; -import com.pehrs.vespa.yql.plugin.swing.TableColumnAdjuster; -import com.pehrs.vespa.yql.plugin.trace.TraceUtils; -import com.pehrs.vespa.yql.plugin.util.NotificationUtils; -import java.awt.BorderLayout; -import java.io.IOException; -import java.net.URISyntaxException; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.JTable; -import javax.swing.event.TableModelEvent; -import org.jetbrains.annotations.NotNull; - -@Deprecated -public class YqlResultsTraceTablePanel extends JBPanel { - private final Project project; - private final int traceTabIndex; - private final int zipkinTabIndex; - private final ZipkinBrowserPanel zipkinPanel; - - private JTabbedPane tabs; - - public YqlResultsTraceTablePanel(Project project, JTabbedPane tabs, int traceTabIndex, int zipkinTabIndex, ZipkinBrowserPanel zipkinPanel) { - super(new BorderLayout()); - this.project = project; - this.tabs = tabs; - this.traceTabIndex = traceTabIndex; - this.zipkinTabIndex = zipkinTabIndex; - this.zipkinPanel = zipkinPanel; - super.setBorder(Borders.empty()); - createComponents(); - } - - private void createComponents() { - JBTable resultsTable = new JBTable(); - resultsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - resultsTable.setBorder(Borders.empty()); - - YqlTraceTableModel tableModel = new YqlTraceTableModel(); - YqlResult.addResultListener(tableModel); - resultsTable.setModel(tableModel); - - tableModel.addTableModelListener(event -> { - // Only update columns when data changes as the order of events is HEADER then DATA. - if (event.getFirstRow() != TableModelEvent.HEADER_ROW) { - TableColumnAdjuster tca = new TableColumnAdjuster(resultsTable, 3); - tca.setColumnDataIncluded(true); - // tca.setColumnMaxWidth(650); - tca.adjustColumns(); - } - - if(tabs != null) { - YqlResult res = YqlResult.getYqlResult(); - if (res.getErrors().size() > 0) { - tabs.setEnabledAt(traceTabIndex, false); - } else { - res.getTrace() - .ifPresentOrElse(trace -> { - tabs.setEnabledAt(traceTabIndex, true); - }, () -> { - tabs.setEnabledAt(traceTabIndex, false); - }); - } - } - }); - - ToolbarDecorator decorator = - ToolbarDecorator.createDecorator(resultsTable) - .initPosition() - .setToolbarPosition(ActionToolbarPosition.TOP); - - // FIXME: Add support for parsing response to Zipkin and upload - DumbAwareAction zipkinAction = new DumbAwareAction("Upload and open in Zipkin", "Upload and view in Zipkin", - YqlIcons.ZIPKIN) { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - if (e == null) { - return; - } - try { - String traceID = TraceUtils.uploadToZipkin(); - - String msg = "Zipkin trace " + traceID + " uploaded!"; - NotificationUtils.showNotification(project, NotificationType.INFORMATION, msg); - - TraceUtils.openTrace(project, traceID, zipkinPanel); - - tabs.setEnabledAt(zipkinTabIndex, true); - tabs.setSelectedIndex(zipkinTabIndex); - - } catch (JsonProcessingException ex) { - String msg = "Zipkin Upload failed"; - NotificationUtils.showNotification(project, NotificationType.ERROR, msg); - } catch (IOException | URISyntaxException ex) { - String msg = "Could not open default browser"; - NotificationUtils.showNotification(project, NotificationType.ERROR, msg); - } - - } - }; - decorator.addExtraAction(zipkinAction); - - JPanel panel = decorator.createPanel(); - panel.setBorder(Borders.empty()); - - super.add(panel, BorderLayout.CENTER); - } - -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreePanel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreePanel.java deleted file mode 100644 index 9c5a869..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreePanel.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.pehrs.vespa.yql.plugin.results; - -import com.fasterxml.jackson.databind.JsonNode; -import com.intellij.ide.dnd.aware.DnDAwareTree; -import com.intellij.openapi.actionSystem.ActionToolbarPosition; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.ui.ToolbarDecorator; -import com.intellij.ui.components.JBLabel; -import com.intellij.ui.components.JBPanel; -import com.intellij.util.ui.JBUI.Borders; -import com.intellij.util.ui.tree.TreeModelAdapter; -import com.pehrs.vespa.yql.plugin.YqlIcons; -import com.pehrs.vespa.yql.plugin.YqlResult; -import com.pehrs.vespa.yql.plugin.results.YqlResultTraceTreeModel.JsonProperty; -import java.awt.BorderLayout; -import javax.swing.JPanel; -import javax.swing.JTabbedPane; -import javax.swing.event.TreeModelEvent; -import org.jetbrains.annotations.NotNull; - -@Deprecated -public class YqlResultsTraceTreePanel extends JBPanel { - private final Project project; - private final int tabIndex; - - private JTabbedPane tabs; - public YqlResultsTraceTreePanel(Project project, JTabbedPane tabs, int index) { - super(new BorderLayout()); - this.project = project; - this.tabs = tabs; - this.tabIndex = index; - super.setBorder(Borders.empty()); - createComponents(); - } - - private void createComponents() { - DnDAwareTree traceTree; - YqlResultTraceTreeModel traceTreeModel = new YqlResultTraceTreeModel(); - traceTreeModel.addTreeModelListener(new TreeModelAdapter() { - @Override - protected void process(@NotNull TreeModelEvent event, - @NotNull TreeModelAdapter.EventType type) { - super.process(event, type); - YqlResult res = YqlResult.getYqlResult(); - if(tabs != null) { - if (res.getErrors().size() > 0) { - tabs.setEnabledAt(tabIndex, false); - } else { - res.getTrace() - .ifPresentOrElse(trace -> { - tabs.setEnabledAt(tabIndex, true); - }, () -> { - tabs.setEnabledAt(tabIndex, false); - }); - } - } - } - }); - YqlResult.addResultListener(traceTreeModel); - traceTree = new DnDAwareTree(traceTreeModel); - - JBLabel label = new JBLabel(); - // FIXME: We need some wrapper for the JsonNode and fieldName - traceTree.setCellRenderer((tree, value, selected, expanded, leaf, row, hasFocus) -> { - JsonProperty property = (JsonProperty) value; - String renderedString = property.name(); - JsonNode node = property.value(); - switch (node.getNodeType()) { - case BOOLEAN -> { - renderedString += ": " + node.asBoolean(); - } - case NUMBER -> { - if (node.isFloat() || node.isDouble()) { - renderedString += ": " + node.asDouble(); - } else if (node.isInt()) { - renderedString += ": " + node.asInt(); - } else if (node.isLong()) { - renderedString += ": " + node.asLong(); - } - } - case STRING -> { - renderedString += ": \"" + node.asText() + "\""; - } - case NULL -> { - renderedString += ": null"; - } - case MISSING -> { - renderedString += ": "; - } - case POJO, OBJECT, ARRAY, BINARY -> { - } - } - - label.setText(renderedString); - label.setIcon(null); - return label; - }); - - ToolbarDecorator decorator = - ToolbarDecorator.createDecorator(traceTree) - .initPosition() - .setToolbarPosition(ActionToolbarPosition.TOP); - - decorator.addExtraAction(new DumbAwareAction("Open in Zipkin", "Upload and view in Zipkin", - YqlIcons.ZIPKIN) { - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - if (e == null) { - return; - } - System.out.println("Open in Zipkin"); - } - }); - JPanel panel = decorator.createPanel(); - panel.setBorder(Borders.empty()); - - super.add(panel, BorderLayout.CENTER); - } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreeTablePanel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreeTablePanel.java index d0f9ab8..f937908 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreeTablePanel.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlResultsTraceTreeTablePanel.java @@ -93,7 +93,7 @@ private void createComponents() { treeTable.setShowGrid(true); TreeTableTree tree = treeTable.getTree(); - UIUtil.setLineStyleAngled(tree); + // UIUtil.setLineStyleAngled(tree); tree.setShowsRootHandles(true); tree.setRootVisible(true); diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlTraceTableModel.java b/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlTraceTableModel.java deleted file mode 100644 index ed6a535..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/results/YqlTraceTableModel.java +++ /dev/null @@ -1,190 +0,0 @@ -package com.pehrs.vespa.yql.plugin.results; - -import com.pehrs.vespa.yql.plugin.YqlResult; -import com.pehrs.vespa.yql.plugin.YqlResult.YqlQueryError; -import com.pehrs.vespa.yql.plugin.YqlResult.YqlResultListener; -import com.pehrs.vespa.yql.plugin.traceorg.TraceRow; -import com.pehrs.vespa.yql.plugin.traceorg.TraceUtils; -import java.util.Date; -import java.util.List; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableModel; -import org.jetbrains.annotations.Nls; - -@Deprecated -public class YqlTraceTableModel extends AbstractTableModel implements TableModel, - YqlResultListener { - - public static final String TIMESTAMP_COLUMN = "ts"; - public static final String RELATIVE_TIMESTAMP_COLUMN = "relative-ts"; - public static final String DOC_TYPE_COLUMN = "doc-type"; - public static final String DIST_KEY_COLUMN = "dist-key"; - public static final String MESSAGE_COLUMN = "message"; - - private static List COLUMNS = List.of( - DOC_TYPE_COLUMN, - DIST_KEY_COLUMN, - TIMESTAMP_COLUMN, - RELATIVE_TIMESTAMP_COLUMN, - MESSAGE_COLUMN - ); - - private final static int DOC_TYPE_COLUMN_INDEX = 0; - private final static int DIST_KEY_COLUMN_INDEX = 1; - private final static int TIMESTAMP_COLUMN_INDEX = 2; - private final static int RELATIVE_TIMESTAMP_COLUMN_INDEX = 3; - private final static int MESSAGE_COLUMN_INDEX = 4; - - private static Object getColumnValue(TraceRow row, int columnIndex) { - switch (columnIndex) { - case DOC_TYPE_COLUMN_INDEX: - return row.docType(); - case DIST_KEY_COLUMN_INDEX: - return row.distKey(); - case TIMESTAMP_COLUMN_INDEX: - return TraceUtils.sdf.format(new Date(row.tsNs() / 1_000_000L)); - case RELATIVE_TIMESTAMP_COLUMN_INDEX: - return String.format("%.3fms", (row.relativeTsNs() / 1_000_000d)); - case MESSAGE_COLUMN_INDEX: - default: - return row.message(); - } - } - - public static final String ERROR_CODE_COLUMN = "code"; - public static final String ERROR_SUMMARY_COLUMN = "summary"; - public static final String ERROR_MESSAGE_COLUMN = "message"; - - private static List ERROR_COLUMNS = List.of( - ERROR_CODE_COLUMN, ERROR_SUMMARY_COLUMN, ERROR_MESSAGE_COLUMN - ); - - private final static int ERROR_CODE_COLUMN_INDEX = 0; - private final static int ERROR_SUMMARY_COLUMN_INDEX = 1; - private final static int ERROR_MESSAGE_COLUMN_INDEX = 2; - - private static Object getErrorColumn(YqlQueryError error, int columnIndex) { - switch (columnIndex) { - case ERROR_CODE_COLUMN_INDEX: - return error.code(); - case ERROR_SUMMARY_COLUMN_INDEX: - return error.message(); - case ERROR_MESSAGE_COLUMN_INDEX: - default: - return error.message(); - } - } - - YqlResult result = null; - List rows = null; - List errorRows = null; - private List columns = null; - - - public YqlTraceTableModel() { - } - - @Override - public int getRowCount() { - if (errorRows != null) { - return errorRows.size(); - } - if (rows == null) { - return 0; - } - return rows.size(); - } - - @Override - public int getColumnCount() { - if (errorRows != null) { - return ERROR_COLUMNS.size(); - } - if (columns == null) { - return 0; - } - return columns.size(); - } - - @Nls - @Override - public String getColumnName(int columnIndex) { - if (errorRows != null) { - return ERROR_COLUMNS.get(columnIndex); - } - if (columns == null) { - return null; - } - return COLUMNS.get(columnIndex); - } - - @Override - public Class getColumnClass(int columnIndex) { - return String.class; - } - - @Override - public boolean isCellEditable(int rowIndex, int columnIndex) { - return false; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (errorRows != null) { - YqlQueryError row = errorRows.get(rowIndex); - return getErrorColumn(row, columnIndex); -// switch (columnIndex) { -// case ERROR_CODE_COLUMN_INDEX: -// return row.code(); -// case ERROR_SUMMARY_COLUMN_INDEX: -// return row.message(); -// case ERROR_MESSAGE_COLUMN_INDEX: -// default: -// return row.message(); -// } - } - if (rows == null) { - return null; - } - // TraceRow row = rows.get(rowIndex); - return getColumnValue(rows.get(rowIndex), columnIndex); -// switch (columnIndex) { -// case DOC_TYPE_COLUMN_INDEX: -// return row.docType(); -// case DIST_KEY_COLUMN_INDEX: -// return row.distKey(); -// case TIMESTAMP_COLUMN_INDEX: -// return TraceUtils.sdf.format(new Date(row.tsNs() / 1_000_000L)); -// case RELATIVE_TIMESTAMP_COLUMN_INDEX: -// return String.format("%.3fms", (row.relativeTsNs() / 1_000_000d)); -// case MESSAGE_COLUMN_INDEX: -// default: -// return row.message(); -// } - } - - @Override - public void setValueAt(Object aValue, int rowIndex, int columnIndex) { - throw new RuntimeException("setValueAt() Not supported!"); - } - - @Override - public void resultUpdated(YqlResult result) { - this.result = result; - List errors = result.getErrors(); - if (errors.isEmpty()) { - this.columns = COLUMNS; - this.rows = com.pehrs.vespa.yql.plugin.traceorg.TraceUtils.getTraceRows(result); - this.errorRows = null; - System.out.println("ROWS: " + this.rows); - } else { - this.columns = ERROR_COLUMNS; - this.rows = null; - this.errorRows = errors; - } - fireTableStructureChanged(); - fireTableDataChanged(); - } - - -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/serviceview/VespaServicesDockFactory.java b/src/main/java/com/pehrs/vespa/yql/plugin/serviceview/VespaServicesDockFactory.java index d5f3850..b55056f 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/serviceview/VespaServicesDockFactory.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/serviceview/VespaServicesDockFactory.java @@ -2,15 +2,11 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; -import com.intellij.openapi.wm.RegisterToolWindowTask; import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.openapi.wm.ToolWindowFactory; -import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; import com.pehrs.vespa.yql.plugin.YQL; -import com.pehrs.vespa.yql.plugin.YqlIcons; import com.pehrs.vespa.yql.plugin.xml.VespaServicesXml; import java.util.Optional; import org.jetbrains.annotations.NotNull; @@ -36,11 +32,6 @@ public void init(@NotNull ToolWindow toolWindow) { } - @Override - public boolean isApplicable(@NotNull Project project) { - return project != null; - } - public static void setServicesXml(VespaServicesXml xml) { servicesXml = xml; if(servicesPanel != null) { @@ -52,25 +43,16 @@ public static void setServicesXml(VespaServicesXml xml) { public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { this.project = project; - // FIXME: Remove the resource and read the real config from the server! - // XmlMapper xmlMapper = new XmlMapper(); - // String xml = YQL.getResource("/services-multiple-groups.xml"); - // String xml = YQL.getResource("/services-single-node.xml"); - // try { - // VespaServicesXml services = xmlMapper.readValue(xml, VespaServicesXml.class); servicesPanel = new VespaServicesPanel(servicesXml); ContentManager contentManager = toolWindow.getContentManager(); Content content = contentManager.getFactory().createContent(servicesPanel, "Service Overview", false); contentManager.addContent(content); contentManager.setSelectedContent(content); - // } catch (IOException e) { - // throw new RuntimeException(e); - // } } public static void openServiceXml(Project project) { - ToolWindow toolWindow = YQL.getVespaToolWindow(project, factory); + ToolWindow toolWindow = YQL.getVespaToolWindow(project); if (toolWindow != null) { final ToolWindow win = toolWindow; @NotNull ContentManager contentManager = win.getContentManager(); diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/settings/YqlAppSettingsComponent.java b/src/main/java/com/pehrs/vespa/yql/plugin/settings/YqlAppSettingsComponent.java index ad2cb4d..6ece33f 100644 --- a/src/main/java/com/pehrs/vespa/yql/plugin/settings/YqlAppSettingsComponent.java +++ b/src/main/java/com/pehrs/vespa/yql/plugin/settings/YqlAppSettingsComponent.java @@ -12,7 +12,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.ui.Messages; -import com.intellij.ui.AnActionButton; import com.intellij.ui.JBColor; import com.intellij.ui.JBSplitter; import com.intellij.ui.OnePixelSplitter; @@ -36,7 +35,6 @@ import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Supplier; import java.util.stream.Collectors; import javax.swing.AbstractListModel; import javax.swing.JButton; @@ -222,8 +220,8 @@ public YqlAppSettingsComponent(Project project) { .disableRemoveAction() .disableDownAction() .disableUpAction(); - decorator.addExtraAction( - AnActionButton.fromAction(new DumbAwareAction("Add Connection", "", General.Add) { + + decorator.addExtraAction(new DumbAwareAction("Add Connection", "", General.Add) { public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { return; @@ -233,9 +231,8 @@ public void actionPerformed(@NotNull AnActionEvent e) { dialog.show(); } } - })); - decorator.addExtraAction( - AnActionButton.fromAction(new DumbAwareAction("Delete Connection", "", General.Remove) { + }); + decorator.addExtraAction(new DumbAwareAction("Delete Connection", "", General.Remove) { public void actionPerformed(@NotNull AnActionEvent e) { if (e == null) { return; @@ -251,7 +248,7 @@ public void actionPerformed(@NotNull AnActionEvent e) { log.debug("Delete connection " + config.name); } } - })); + }); JPanel panel = decorator.createPanel(); panel.setBorder(Borders.empty()); diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/Trace.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/Trace.java deleted file mode 100644 index 2c60c49..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/Trace.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -@Deprecated -record Trace(TraceMessage message, TraceHolder parentHolder, Double relativeTsNs, String documentType, Integer distributionKey, - String tag, List threads) implements TraceHolder { - - public TraceRow toTraceRow() { - return new TraceRow(message.tsNs(), relativeTsNs, documentType, distributionKey, tag); - } - - public Trace withParentHolder(TraceHolder traceHolder) { - return new Trace(message, traceHolder, relativeTsNs, documentType, distributionKey, tag, threads); - } - - public List toTraceRows(String documentType, Integer distributionKey) { - List rows = new ArrayList<>(); - TraceRow first = new TraceRow((long) (message.tsNs() + relativeTsNs), relativeTsNs, documentType, - distributionKey, tag); -// List subTraces = this.traces.stream().flatMap( -// trace -> trace.toTraceRows(documentType, distributionKey).stream()) -// .collect(Collectors.toList() -// ); - List threadTraces = this.threads.stream().flatMap( - thread -> thread.toTraceRows().stream() - ).collect(Collectors.toList()); - rows.add(first); - // rows.addAll(subTraces); - rows.addAll(threadTraces); - return rows; - } - - public List toZipkinSpans(TraceMessage traceMessage, - ZipkinSpan parentZip, - String documentType, - Integer distributionKey) { - - // Optional prev = traceMessage.getThread().getPrevTraceOf(this); - Optional prev = parentHolder.getPrevTraceOf(this); - - long duration = prev - .map(p -> (long)((p.relativeTsNs - this.relativeTsNs) / 1000d)) - .orElseGet(() -> (long)(this.relativeTsNs / 1000d)); - - long timestamp = prev - .map(p -> (long)((traceMessage.tsNs() + p.relativeTsNs) / 1000d)) - .orElseGet(() -> traceMessage.tsNs() / 1000l); - - ZipkinSpan thisZip = ZipkinSpan.create(parentZip.traceId(), this.tag) - .withParentId(parentZip.id()) - .withTimestamp(timestamp) - .withDuration(duration) - .withTags(Map.of( - "docType", documentType, - "distKey", distributionKey - )); - - List spans = new ArrayList<>(); - spans.add(thisZip); - spans.addAll(this.threads.stream().flatMap( - t -> t.toZipkinSpans(traceMessage, thisZip, documentType, distributionKey).stream() - ).toList()); - - return spans; - } - - @Override - public Optional getPrevTraceOf(Trace trace) { - return this.threads.stream() - .map(t -> t.getPrevTraceOf(trace)) - .filter(opt -> opt.isPresent()) - .findFirst() - .orElseGet(() -> Optional.empty()); - } -// -// public List toZipkinSpans(ZipkinSpan parent, -// String documentType, -// Integer distributionKey) { -// -// List rows = new ArrayList<>(); -//// TraceRow first = new TraceRow((long) (tsNs + timestampNs), timestampNs, documentType, -//// distributionKey, tag); -// long tsMicro = (long) (message.tsNs() + relativeTsNs) / 1000L; -// ZipkinSpan first = ZipkinSpan.create(parent.traceId(), tag) -// .withParentId(parent.id()) -// .withTimestamp(tsMicro) -// .withTags(Map.of( -// "docType", documentType, -// "distKey", distributionKey -// )); -//// List subTraces = this.traces.stream().flatMap( -//// trace -> trace.toZipkinSpans(first, documentType, distributionKey).stream()) -//// .collect(Collectors.toList() -//// ); -// List threadTraces = this.threads.stream().flatMap( -// thread -> thread.toZipkinSpans(first).stream() -// ).collect(Collectors.toList()); -// rows.add(first); -// // rows.addAll(subTraces); -// rows.addAll(threadTraces); -// return rows; -// } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceHolder.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceHolder.java deleted file mode 100644 index f6c3c81..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceHolder.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import java.util.Optional; -@Deprecated -public interface TraceHolder { - - Optional getPrevTraceOf(Trace trace); - -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceMessage.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceMessage.java deleted file mode 100644 index a43355e..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceMessage.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -@Deprecated -public record TraceMessage(Long tsNs, - List traces, - Integer distributionKey, - String documentType, - Double durationNs) implements TraceHolder{ - - public TraceMessage withTraces(List traces) { - return new TraceMessage(this.tsNs, traces, this.distributionKey, this.documentType, this.durationNs); - } - - public List toTraceRows() { - // "2024-03-21 20:56:36.604 UTC" - List rows = new ArrayList<>(); - String msg = String.format("%s: docType:%s, distKey: %d - duration: %.3fms", - TraceUtils.sdf.format(new Date(tsNs / 1_000_000L)), - documentType, - distributionKey, - durationNs / 1_000_000d); - TraceRow first = new TraceRow(tsNs, 0.0d, documentType, distributionKey, msg); - List theTraces = this.traces.stream().flatMap(trace -> { - // TraceRow first = new TraceRow(trace.timestampMs, trace.tag); - return trace.toTraceRows(documentType, distributionKey).stream(); - }).collect(Collectors.toList()); - rows.add(first); - rows.addAll(theTraces); - return rows; - } - - public List toZipkinSpans(ZipkinSpan root) { - String name = String.format("%s: docType:%s, distKey: %d - duration: %.3fms", - TraceUtils.sdf.format(new Date(tsNs / 1_000_000L)), - documentType, - distributionKey, - durationNs / 1_000_000d); - long tsMicros = tsNs / 1000L; // start_time - ZipkinSpan msgZip = ZipkinSpan.create(root.traceId(), name) - .withParentId(root.id()) - .withTimestamp(tsMicros) - .withDuration((long)(durationNs / 1_000d)) // Microseconds - .withTags(Map.of( - "docType", documentType, - "distKey", distributionKey - )); - - List theSpans = new ArrayList<>(); - theSpans.add(msgZip); - theSpans.addAll(this.traces.stream().flatMap(trace -> { - // TraceRow first = new TraceRow(trace.timestampMs, trace.tag); - return trace.toZipkinSpans(this, msgZip, documentType, distributionKey).stream(); - }).collect(Collectors.toList())); - - - return theSpans; - } - - public TraceThread getThread() { - return new TraceThread(this, this, documentType, distributionKey, this.traces); - } - - - @Override - public Optional getPrevTraceOf(Trace trace) { - for (int i = 0; i < traces.size(); i++) { - if (traces.get(i).equals(trace)) { - if (i > 0) { - return Optional.of(traces.get(i - 1)); - } else { - return Optional.empty(); - } - } - } - return Optional.empty(); - } - -// public List toZipkinSpans(ZipkinSpan root) { -// long tsMicro = tsNs / 1000L; // start_time -// -// List rows = new ArrayList<>(); -// String msg = String.format("%s: docType:%s, distKey: %d - duration: %.3fms", -// TraceUtils.sdf.format(new Date(tsNs / 1_000_000L)), -// documentType, -// distributionKey, -// durationNs / 1_000_000d); -// // TraceRow first = new TraceRow(tsNs, 0.0d, documentType, distributionKey, msg); -// ZipkinSpan first = ZipkinSpan.create(root.traceId(), msg) -// .withParentId(root.id()) -// .withTimestamp(tsMicro) -// .withDuration((long)(durationNs / 1_000d)) // Microseconds -// .withTags(Map.of( -// "docType", documentType, -// "distKey", distributionKey -// )); -// List theSpans = new ArrayList<>(); -// theSpans.add(first); -// theSpans.addAll(this.traces.stream().flatMap(trace -> { -// // TraceRow first = new TraceRow(trace.timestampMs, trace.tag); -// return trace.toZipkinSpans(first, documentType, distributionKey).stream(); -// }).collect(Collectors.toList())); -// -// // Adjust duration and timestamp -//// List spansWithDuration = theSpans.stream() -//// .map(span -> span -//// .adjustDuration(theTraces) -//// .adjustTimestamp(theTraces)).collect(Collectors.toList() -//// ); -// -// // Make sure the top level duration is correct :-) -// // rows.add(first.withDuration((long)(durationNs / 1_000d))); // Microseconds -// // rows.addAll(spansWithDuration); -// -// rows.add(first); -// rows.addAll(theSpans); -// -// return rows; -// -// } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceRow.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceRow.java deleted file mode 100644 index 0075959..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceRow.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import org.jetbrains.annotations.NotNull; -@Deprecated -public record TraceRow(Long tsNs, - Double relativeTsNs, - String docType, - Integer distKey, - String message) implements Comparable { - - @Override - public int compareTo(@NotNull TraceRow other) { - // return (int) (1_000_000d * (this.relativeTs - other.relativeTs)); - int diff = this.docType.compareTo(other.docType); - if (diff == 0) { - diff = this.distKey - other.distKey; - } - if (diff == 0) { - diff = (int) (this.tsNs - other.tsNs); - } - return diff; - } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceThread.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceThread.java deleted file mode 100644 index 9652140..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceThread.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -@Deprecated -record TraceThread(TraceMessage message, TraceHolder parentHolder, String documentType, Integer distributionKey, List traces) implements TraceHolder{ - - public List toTraceRows() { - return traces.stream().flatMap( - trace -> trace.toTraceRows(documentType, distributionKey).stream() - ).collect(Collectors.toList()); - } - - public Optional getPrevTraceOf(Trace trace) { - for (int i = 0; i < traces.size(); i++) { - if (traces.get(i).equals(trace)) { - if (i > 0) { - return Optional.of(traces.get(i - 1)); - } else { - return Optional.empty(); - } - } - } - return Optional.empty(); - } - - - // public List toZipkinSpans(ZipkinSpan parent) { -// return traces.stream().flatMap( -// trace -> trace.toZipkinSpans(parent, documentType, distributionKey).stream() -// ).collect(Collectors.toList()); -// } - - public List toZipkinSpans(TraceMessage traceMessage, - ZipkinSpan parentZip, - String documentType, - Integer distributionKey) { - - long duration = parentZip.duration(); - long timestamp = parentZip.timestamp(); - - ZipkinSpan thisZip = ZipkinSpan.create(parentZip.traceId(), "Thread") - .withParentId(parentZip.id()) - .withTimestamp(timestamp) - .withDuration(duration) - .withTags(Map.of( - "docType", documentType, - "distKey", distributionKey - )); - - List spans = new ArrayList<>(); - spans.add(thisZip); - spans.addAll(traces.stream().flatMap(trace -> { - return trace.toZipkinSpans(traceMessage, thisZip, documentType, distributionKey).stream(); - }).toList()); - - return spans; - } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceUtils.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceUtils.java deleted file mode 100644 index edfbfc1..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/TraceUtils.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import com.fasterxml.jackson.databind.JsonNode; -import com.pehrs.vespa.yql.plugin.YqlResult; -import com.pehrs.vespa.yql.plugin.util.JsonUtils; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; -import org.jetbrains.annotations.NotNull; - -@Deprecated -public class TraceUtils { - - public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz", - Locale.ENGLISH); - - - public static List getTraceRows(YqlResult result) { - - List messageNodes = getTraceRoots(result); - List messages = messageNodes.stream().flatMap( - node -> getTraceMessages(node).stream() - ).collect(Collectors.toList()); - - // Collections.sort mutates the list so - // let's make sure we have a mutable List to sort - List res = new ArrayList<>(messages.stream().flatMap( - message -> message.toTraceRows().stream() - ).collect(Collectors.toList())); - Collections.sort(res); - return res; - } - - public static List getTraceRoots(JsonNode trace) { - JsonNode message = trace.get("message"); - if (message != null && message.isArray()) { - // We have a match - return List.of(trace); - } - JsonNode children = trace.get("children"); - if (children != null) { - return JsonUtils.toList(children).stream() - .flatMap(child -> getTraceRoots(child).stream()) - .collect(Collectors.toList()); - } - return List.of(); - - } - - static List getTraceRoots(YqlResult result) { - return result.getTrace() - .map(TraceUtils::getTraceRoots) - .orElse(List.of()); - } - - private static List getTraces(TraceMessage msg, JsonNode node, String documentType, - Integer distributionKey) { - return JsonUtils.toList(node.get("traces")) - .stream() - .map(traceNode -> { - String tag = ""; - JsonNode tagNode = traceNode.get("tag"); - if (tagNode != null) { - tag = tagNode.asText(); - } - JsonNode eventNode = traceNode.get("event"); - if (eventNode != null) { - tag = eventNode.asText(); - } - Double timstampNs = 1_000_000d * traceNode.get("timestamp_ms").asDouble(); - List threads = getTraceThreads(msg, traceNode, documentType, distributionKey); - // return new Trace(tag, timstampMs, traces, threads); - return new Trace(msg, msg, timstampNs, documentType, distributionKey, tag, threads); - }).collect(Collectors.toList()); - } - - private static List getTraceThreads(TraceMessage msg, JsonNode traceNode, - String documentType, - Integer distributionKey) { - @NotNull List traces = getTraces(msg, traceNode, documentType, distributionKey); - if(traces.size()> 0) { - // Single thread trace - return List.of(new TraceThread(msg, msg, documentType, distributionKey, traces)); - } - @NotNull List threadNodes = JsonUtils.toList(traceNode.get("threads")); - return threadNodes.stream().map(thread -> { - List threadTraces = getTraces(msg, thread, documentType, distributionKey); - return new TraceThread(msg, msg, documentType, distributionKey, threadTraces); - }).collect(Collectors.toList()); - } - - static List getTraceMessages(JsonNode root) { - @NotNull List nodes = JsonUtils.toList( - root.get("message")); - - return nodes.stream().map(node -> { - System.out.println(node); - String startTime = node.get("start_time").asText(); - Date date = null; - try { - date = sdf.parse(startTime); - } catch (ParseException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - long tsNs = 1_000_000L * date.getTime(); - - Integer distributionKey = node.get("distribution-key").asInt(); - String documentType = node.get("document-type").asText(); - Double durationMs = node.get("duration_ms").asDouble(); - Double durationNs = 1_000_000d * durationMs; - TraceMessage msg = new TraceMessage(tsNs, List.of(), distributionKey, documentType, durationNs); - List traces = getTraces(msg, node, documentType, distributionKey); - return msg.withTraces(traces); - }).collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinEndpoint.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinEndpoint.java deleted file mode 100644 index e1500ba..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinEndpoint.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; -@Deprecated -public record ZipkinEndpoint(String serviceName) { - -} diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinSpan.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinSpan.java deleted file mode 100644 index 9466c88..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinSpan.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -@Deprecated -public record ZipkinSpan(String traceId, - String id, - String parentId, - String name, - String kind, - Long timestamp, // Microseconds - Long duration, // Microseconds - ZipkinEndpoint localEndpoint, - ZipkinEndpoint remoteEndpoint, - Map tags) { - - public static final String VESPA_PROTON_SERVICE = "Vespa Proton Service"; - public static final String VESPA_QUERY_SERVICE = "Vespa QUERY Service"; - - public static ZipkinSpan create(String traceId, String name) { - return new ZipkinSpan(traceId, - ZipkinUtils.generateId(), - null, - name, "CLIENT", - 0L, - 0L, - new ZipkinEndpoint(VESPA_PROTON_SERVICE), - new ZipkinEndpoint(VESPA_PROTON_SERVICE), - new HashMap<>()); - } - - public ZipkinSpan withTraceId(String newValue) { - return new ZipkinSpan(newValue, id, parentId, name, kind, timestamp, duration, localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withId(String newValue) { - return new ZipkinSpan(traceId, newValue, parentId, name, kind, timestamp, duration, - localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withParentId(String newValue) { - return new ZipkinSpan(traceId, id, newValue, name, kind, timestamp, duration, localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withName(String newValue) { - return new ZipkinSpan(traceId, id, parentId, newValue, kind, timestamp, duration, localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withKind(String newValue) { - return new ZipkinSpan(traceId, id, parentId, name, newValue, timestamp, duration, localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withTimestamp(Long newValue) { - return new ZipkinSpan(traceId, id, parentId, name, kind, newValue, duration, localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withDuration(Long newValue) { - return new ZipkinSpan(traceId, id, parentId, name, kind, timestamp, newValue, localEndpoint, - remoteEndpoint, tags); - } - - public ZipkinSpan withLocalEndpoint(ZipkinEndpoint newValue) { - return new ZipkinSpan(traceId, id, parentId, name, kind, timestamp, duration, newValue, - remoteEndpoint, - tags); - } - - public ZipkinSpan withRemoteEndpoint(ZipkinEndpoint newValue) { - return new ZipkinSpan(traceId, id, parentId, name, kind, timestamp, duration, localEndpoint, - newValue, - tags); - } - - public ZipkinSpan withTags(Map newValue) { - return new ZipkinSpan(traceId, id, parentId, name, kind, timestamp, duration, localEndpoint, - remoteEndpoint, newValue); - } - -// public Long getAdjustedTimestamp(List inList){ -// List children = getChildren(inList); -// if(children.size() > 0) { -// List peers = getPeers(inList); -// Optional prev = getPrevSpan(peers); -// if(prev.isEmpty()) { -// // Get parent timstamp -// return getParent(inList).map(parent -> parent.timestamp) -// .orElse(this.timestamp); -// } else { -// return prev.map(p -> p.timestamp) -// .orElse(this.timestamp); -// } -// } -// return this.timestamp; -// } -// -// public Long getDurationInMicros(List inList) { -// List children = getChildren(inList); -// if(children.size() == 0) { -// -// List peers = getPeers(inList); -//// Optional next = getNextSpan(peers); -//// return next.map( -//// nextSpan -> nextSpan.timestamp - this.timestamp -//// ).orElse(getDurationViaParent(inList)); -// Optional prev = getPrevSpan(peers); -// if(prev.isPresent()) { -// return this.timestamp - prev.get().timestamp; -// } else { -// return getParent(inList).map(parent -> this.timestamp - parent.timestamp) -// .orElse(this.duration); -// } -// } else { -// List peers = getPeers(inList); -// Optional prev = getPrevSpan(peers); -// if(prev.isPresent()) { -// return prev.map(p -> this.timestamp - p.timestamp) -// .orElse(this.duration); -// } else { -// Optional parent = getParent(inList); -// return parent.map(p -> this.timestamp - p.timestamp) -// .orElse(this.duration); -// } -// } -// } - - private Long getDurationViaParent(List inList) { - return getParent(inList) - .map(parent -> parent.timestamp - timestamp) - .orElse(0L); - } - - - private List getChildren(List inList) { - return inList.stream().filter(span -> span.parentId().equals(this.id())) - .collect(Collectors.toList()); - } - - private Optional getParent(List inList) { - return inList.stream().filter(span -> span.id().equals(this.parentId())) - .findFirst(); - } - - - private Optional getPrevSpan(List peers) { - for (int i = 0; i < peers.size(); i++) { - if (peers.get(i).id.equals(this.id)) { - if (i > 0) { - return Optional.of(peers.get(i - 1)); - } else { - return Optional.empty(); - } - } - } - return Optional.empty(); - } - - private Optional getNextSpan(List peers) { - for (int i = 0; i < peers.size(); i++) { - if (peers.get(i).id.equals(this.id)) { - if ((i + 1) < peers.size()) { - return Optional.of(peers.get(i + 1)); - } else { - return Optional.empty(); - } - } - } - return Optional.empty(); - } - - private List getPeers(List inList) { - return inList.stream() - .filter(span -> span.parentId().equals(this.parentId)) - .collect(Collectors.toList()); - } - -// public ZipkinSpan adjustDuration(List inList) { -// return withDuration(this.getDurationInMicros(inList)); -// } -// -// /*** -// * Adjust the timstamp if needed -// */ -// public ZipkinSpan adjustTimestamp(List inList) { -// return withTimestamp(this.getAdjustedTimestamp(inList)); -// } -} - diff --git a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinUtils.java b/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinUtils.java deleted file mode 100644 index c05db49..0000000 --- a/src/main/java/com/pehrs/vespa/yql/plugin/traceorg/ZipkinUtils.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.pehrs.vespa.yql.plugin.traceorg; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.intellij.notification.NotificationGroupManager; -import com.intellij.notification.NotificationType; -import com.intellij.openapi.project.Project; -import com.intellij.ui.jcef.JBCefApp; -import com.pehrs.vespa.yql.plugin.YqlResult; -import com.pehrs.vespa.yql.plugin.results.ZipkinBrowserPanel; -import com.pehrs.vespa.yql.plugin.settings.YqlAppSettingsState; -import com.pehrs.vespa.yql.plugin.util.BrowserUtils; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Deprecated -public class ZipkinUtils { - - static Logger log = LoggerFactory.getLogger(ZipkinUtils.class); - - static SecureRandom rnd = new SecureRandom(); - - public static String generateId() { - return String.format("%08x", rnd.nextLong()); - } - - private static Long getTimestamp(List msgSpans) { - return msgSpans.stream().mapToLong(span -> span.timestamp()) - .min().orElse(0L); - } - - private static Long getDurationMicros(List msgSpans) { - Long start = getTimestamp(msgSpans); - - Long maxVal = msgSpans.stream() - .mapToLong(span -> span.timestamp() + span.duration()) - .max().orElse(start); - - return maxVal - start; - } - - public static List getZipkinSpans(YqlResult result) { - List messageNodes = TraceUtils.getTraceRoots(result); - List messages = messageNodes.stream().flatMap( - node -> TraceUtils.getTraceMessages(node).stream() - ).collect(Collectors.toList()); - - String traceId = ZipkinUtils.generateId(); - ZipkinSpan root = ZipkinSpan.create(traceId, "/search/"); - List res = new ArrayList<>(); - - List msgTraces = messages.stream().flatMap( - message -> message.toZipkinSpans(root).stream() - ).collect(Collectors.toList()); - - Long tsMicro = getTimestamp(msgTraces); - Long durationMicros = getDurationMicros(msgTraces); - - res.add( - root.withTimestamp(tsMicro) - .withDuration(durationMicros) // Microseconds - .withLocalEndpoint(new ZipkinEndpoint(ZipkinSpan.VESPA_QUERY_SERVICE)) - .withRemoteEndpoint(new ZipkinEndpoint(ZipkinSpan.VESPA_PROTON_SERVICE)) - ); - res.addAll(msgTraces); - // Collections.sort(res); - return res; - } - - - public static String uploadToZipkin() throws JsonProcessingException { - YqlResult result = YqlResult.getYqlResult(); - - List spans = ZipkinUtils.getZipkinSpans(result); - - ObjectMapper mapper = new ObjectMapper(); - String zipkinJson = mapper - .setSerializationInclusion(JsonInclude.Include.NON_NULL) - .writerWithDefaultPrettyPrinter() - .writeValueAsString(spans); - - YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); - - HttpPost request = new HttpPost(settings.getState().zipkinEndpoint + "/api/v2/spans"); - request.addHeader("content-type", "application/json;charset=UTF-8"); - StringEntity entity = new StringEntity(zipkinJson, ContentType.APPLICATION_JSON); - request.setEntity(entity); - - try (CloseableHttpClient httpClient = HttpClients.custom() - .build()) { - CloseableHttpResponse response = httpClient.execute(request); - try { - String responseString = EntityUtils.toString(response.getEntity()); - log.debug("HTTP Response Status: " + response.getStatusLine()); - log.trace("HTTP Response: " + responseString); - return spans.get(0).traceId(); // Should be the same for all of them :-) - } finally { - response.close(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static void openTrace(Project project, String traceId, ZipkinBrowserPanel zipkinPanel) - throws URISyntaxException, IOException { - - URI uri = getUri(traceId); - - if (JBCefApp.isSupported()) { - zipkinPanel.loadURL(traceId); - } else { -// if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { -// Desktop.getDesktop().browse(uri); -// } - // Workaround is to run xdg-open ... - try { - BrowserUtils.openBrowser(uri); - } catch (IOException ex) { - NotificationGroupManager.getInstance() - .getNotificationGroup("Vespa YQL") - .createNotification("Could not open browser: " + ex.getMessage(), - NotificationType.ERROR) - .notify(project); - } - } - } - - @NotNull - public static URI getUri(String traceID) throws URISyntaxException { - YqlAppSettingsState settings = YqlAppSettingsState.getInstance(); - URI uri = new URI(String.format("%s/zipkin/traces/%s", settings.zipkinEndpoint, traceID)); - return uri; - } -} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 88caa54..296fdd3 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -9,7 +9,7 @@ - + com.github.chengpohi @@ -194,13 +194,11 @@ anchor="right" icon="com.pehrs.vespa.yql.plugin.YqlIcons.FILE" factoryClass="com.pehrs.vespa.yql.plugin.dock.YqlDockFactory"/> -